가우스 행렬 생성


12

가우시안 블러 는 이미지를 부드럽게 흐리게하는 데 사용되는 방법입니다. 이미지의 픽셀과 함께 매트릭스를 만들어 매트릭스를 만드는 과정이 포함됩니다. 이 도전에서, 당신의 임무는 가우시안 블러에 사용되는 매트릭스를 구성하는 것입니다. 치수 (2 r + 1 × 2 r + 1) 의 행렬을 구성하기 위해 블러의 반경이 될 입력 r 과 표준 편차가 될 입력 σ 를 가져옵니다 . 해당 행렬의 각 값 은 중심으로부터 각 방향으로의 절대 거리에 의존 하는 ( x , y ) 값을 가지며 공식에서 G ( x , y ) 를 계산하는 데 사용됩니다G

공식

예를 들어, r = 2이면 5 x 5 행렬을 생성하려고합니다. 먼저 ( x , y ) 값 의 행렬 은

(2, 2) (1, 2) (0, 2) (1, 2) (2, 2)
(2, 1) (1, 1) (0, 1) (1, 1) (2, 1)
(2, 0) (1, 0) (0, 0) (1, 0) (2, 0)
(2, 1) (1, 1) (0, 1) (1, 1) (2, 1)
(2, 2) (1, 2) (0, 2) (1, 2) (2, 2)

그리고,하자 σ = 1.5를 적용하고 G를 각각 ( X , Y )

0.0119552 0.0232856 0.0290802 0.0232856 0.0119552
0.0232856 0.0453542 0.0566406 0.0453542 0.0232856
0.0290802 0.0566406 0.0707355 0.0566406 0.0290802
0.0232856 0.0453542 0.0566406 0.0453542 0.0232856
0.0119552 0.0232856 0.0290802 0.0232856 0.0119552

일반적으로 이미지 블러 링에서이 행렬은 해당 행렬의 모든 값의 합을 가져 와서 나누어서 정규화됩니다. 이 문제의 경우에는 필요하지 않으며 수식으로 계산 된 원시 값이 출력이어야합니다.

규칙

  • 이것은 이므로 가장 짧은 코드가 승리합니다.
  • 입력 r 은 음이 아닌 정수이고 σ 는 양의 실수입니다.
  • 출력은 행렬을 나타내야합니다. 2d 배열, 2d 배열을 나타내는 문자열 또는 이와 유사한 형식으로 형식화 할 수 있습니다.
  • 부동 소수점 부정확성은 계산되지 않습니다.

테스트 사례

(r, σ) = (0, 0.25)
2.54648

(1, 7)
0.00318244 0.00321509 0.00318244
0.00321509 0.00324806 0.00321509
0.00318244 0.00321509 0.00318244

(3, 2.5)
0.00603332 0.00900065 0.0114421  0.012395 0.0114421 0.00900065 0.00603332
0.00900065  0.0134274 0.0170696 0.0184912 0.0170696  0.0134274 0.00900065
 0.0114421  0.0170696 0.0216997  0.023507 0.0216997  0.0170696  0.0114421
  0.012395  0.0184912  0.023507 0.0254648  0.023507  0.0184912   0.012395
 0.0114421  0.0170696 0.0216997  0.023507 0.0216997  0.0170696  0.0114421
0.00900065  0.0134274 0.0170696 0.0184912 0.0170696  0.0134274 0.00900065
0.00603332 0.00900065 0.0114421  0.012395 0.0114421 0.00900065 0.00603332

(4, 3.33)
0.00339074 0.00464913 0.00582484 0.00666854 0.00697611 0.00666854 0.00582484 0.00464913 0.00339074
0.00464913 0.00637454 0.00798657  0.0091434 0.00956511  0.0091434 0.00798657 0.00637454 0.00464913
0.00582484 0.00798657  0.0100063  0.0114556   0.011984  0.0114556  0.0100063 0.00798657 0.00582484
0.00666854  0.0091434  0.0114556   0.013115  0.0137198   0.013115  0.0114556  0.0091434 0.00666854
0.00697611 0.00956511   0.011984  0.0137198  0.0143526  0.0137198   0.011984 0.00956511 0.00697611
0.00666854  0.0091434  0.0114556   0.013115  0.0137198   0.013115  0.0114556  0.0091434 0.00666854
0.00582484 0.00798657  0.0100063  0.0114556   0.011984  0.0114556  0.0100063 0.00798657 0.00582484
0.00464913 0.00637454 0.00798657  0.0091434 0.00956511  0.0091434 0.00798657 0.00637454 0.00464913
0.00339074 0.00464913 0.00582484 0.00666854 0.00697611 0.00666854 0.00582484 0.00464913 0.00339074

pi와 e가 얼마나 정확해야합니까?
xnor

@xnor 좋은 질문입니다. 언어가 허용하는 경우 해당 값이 이미 변수 나 비슷한 것으로 저장되어 있다고 가정 할 수 있습니다. 그렇지 않은 경우 pi = 3.14 및 e = 2.72로 소수점 이하 두 자리까지 값을 사용하여 각 값을 단일 바이트로 계산할 수 있습니다. 물론 최종 답변에서 부정확 한 내용은 다시 계산되지 않습니다.
마일

출력은 10 진수 여야합니까, 상수가있는 정확한 숫자 일 수 있습니까?
JungHwan Min

@JungHwanMin Mathematica와 같은 정확한 숫자는 괜찮습니다.
마일

1
@miles 나는 당신이 단지 특정 정밀도를 요구한다면 더 쉬울 것이라고 생각합니다 (예 : 소수점 3 자리).
orlp

답변:


7

Mathematica, 60 54 50 바이트

4 바이트에 대한 @GregMartin에게 감사드립니다!

Array[s=2#2^2;E^(-{##}.{##}/s)/π/s&,1+2{#,#},-#]&

r과 sigma를 입력으로 취하고 행렬 (정확한 숫자)을 반환합니다.

내장 버전 (58 바이트)

GaussianMatrix[{##},Standardized->1<0,Method->"Gaussian"]&

물론 Mathematica에는 이것도 내장되어 있지만 너무 깁니다.


4
당신은 끝에 -l의해 대체 할 수 있습니다 -#( Array두 차원에 걸쳐 스레드가됩니다). l4 바이트를 절약 하여 정의 할 필요가 없습니다 .
Greg Martin

5

MATL , 20 바이트

_G&:U&+iUE/_Ze5MYP*/

온라인으로 사용해보십시오!

설명

_     % Take input r implicitly. Negate
G     % Push r again
&:    % Binary range: [-r -r+1 ... r]
U     % Square, elementwise
&+    % Matrix of all pairwise additions
i     % Take input σ
U     % Square
E     % Multiply by 2. Gives 2σ^2
/     % Divide
_     % Negate
Ze    % Exponential
5M    % Push 2σ^2 again
YP    % Push pi
*     % Multiply
/     % Divide. Display implicitly



4

파이썬, 88 바이트

lambda r,s:[[.5/3.14/s/s/2.72**((x*x+y*y)/2/s/s)for x in range(-r,r+1)]for y in range(-r,r+1)]

각각 1 바이트 비용으로 3.14 및 2.72를 하드 코딩 할 수있는 규칙을 사용합니다.


1

펄 6 , 71 바이트

->\r,\σ{map ->\y{map ->\x{exp((x*x+y*y)/-2/σ/σ)/2/pi/σ/σ},-r..r},-r..r}

기술적으로 이것은 인코딩되어 파일에 저장되는 경우 71 바이트 이상일 수 있지만 실제 그리스어 시그마로 "시그마"입력의 이름을 지정할 수는 없었습니다. 원하는 경우 일반 ASCII 문자로 이름을 바꿀 수 있습니다.


1

SAS 매크로 언어, 296 바이트

아마도이 작업을 수행하는 훨씬 효율적인 방법이지만 작동합니다. :)

이 코드는 결과 데이터 세트를 인쇄합니다.

%macro G(r,s);%let l=%eval(2*&r+1);%let pi=%sysfunc(constant(pi));data w;array a[*] t1-t&l;%do i=-&r %to &r;%do j=-&r %to &r;%let t=%sysfunc(sum(&j,&r,1));a[&t]=%sysevalf(1/(2*&pi*&s**2)*%sysfunc(exp(-(%sysfunc(abs(&j))**2+%sysfunc(abs(&i))**2)/(2*&s**2))));%end;output;%end;proc print;run;%mend;

1

하스켈, 59 바이트

r#s|i<-[-r..r]=[[exp(-(x*x+y*y)/2/s/s)/2/pi/s/s|x<-i]|y<-i]

사용 예 :

1#7

[[3.1824449424224664e-3,3.2150851187016326e-3,3.1824449424224664e-3],
 [3.2150851187016326e-3,3.2480600630999047e-3,3.2150851187016326e-3],
 [3.1824449424224664e-3,3.2150851187016326e-3,3.1824449424224664e-3]]

0

파이썬 2.7, 167 바이트

매우 간단한 해결책 :

from __future__ import division;from math import*;r,s=input();s*=2*s;R=range(-r,r+1);print"\n".join("\t".join(str(pow(e,-(x*x+y*y)/s)/(pi*s))[:9]for x in R)for y in R)

여기에서보십시오 !

언 골프 드 :

from __future__ import division
from math import *
r,s = input()                         # Take input
s *= 2*s                              # Set s = 2*s^2; simplifies the expression
R = range(-r,r+1)                     # Range object; used twice

                                   # G(x,y)             # Stripped
print "\n".join("\t".join(str(pow(e,-(x*x + y*y)/s)/(pi*s))[:9] for x in R) for y in R)

5
from __future__ import division, 정말?
orlp
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.