2

참조 편집이상한 행동을 할 때 큰 반경을 사용하여 이미지를 흐리게 가우스/표준 편차

내가 사용하는 대신 MATLAB에 내 자신에 가우스 흐림 알고리즘을 구현하기 위해 노력 내장 된 알고리즘을 이해하는 이유 상세히.

나는 interesting implementation을 발견했으며 누군가 이미 문의했습니다. how to code that kind of algorithm. 그래서 그것은 사업이 아닙니다.

이 또한 내가 GIMP처럼 주어진 반경의 표준 편차를 계산하려면 다음 수식을 사용하지 :

stdDeviation = sqrt(-(radius^2)/(2*log10(1/255))); 

내 알고리즘은 반경의 작은 값에 대한 작업 (예 : 3,5,7) 아무 문제없이 (당신을 차이를 최소한으로 볼 수는 없습니다.) 난 (21)의 반경 화상 흐림하려고하면, 출력은 다음과 같다 : 분명히

Matlab´s/GIMP´s result

: imgaussfilt(A,sigma) 출력 GIMP's/MATLAB's 비교

My result

알고리즘은 동일한 (또는 적어도 유사한) 출력 이미지를 계산하지 않습니다. GIMP/MATLAB의 imgaussfilt(A,sigma)은 무엇을 의미합니까?

이미지의 경계가 무시 될 수 있습니다. 나는 그 문제를 알고있다. 하지만 내 출력 이미지에의 '이상한 픽셀 줄무늬'인 의 출처를 이해하지 못했습니다.

function y = gaussianBlurSepTest(inputImage) 
% radius in pixel; RADIUS MUST BE ODD! 
radius = 21; 
% approximate value for standard deviation 
stdDeviation = sqrt(-(radius^2)/(2*log10(1/255))); 

ind = -floor(radius/2):floor(radius/2); 
[X, Y] = meshgrid(ind, ind); 
h = exp(-(X.^2 + Y.^2)/(2*stdDeviation*stdDeviation)); 
h = h/sum(h(:)); 

redChannel = inputImage(:,:,1); 
greenChannel = inputImage(:,:,2); 
blueChannel = inputImage(:,:,3); 

redBlurred = conv2(redChannel, h); 
greenBlurred = conv2(greenChannel, h); 
blueBlurred = conv2(blueChannel, h); 

y = cat(3, uint8(redBlurred), uint8(greenBlurred), uint8(blueBlurred)); 

편집 :

완성도를 위해서

다른 사람들을 도울 수 :

완성도의 이유로

, 여기에 소스 코드 내가 erfan's 수정을 적용했다. 결과는 훨씬 나아졌지만 여전히 김프의 계산과 명백한 차이가 있습니다. 김프의 결과는 '더 부드럽게'보입니다.

구현 된 알고리즘 :

function y = gaussianBlurSepTest(inputImage) 
radius = 21; 
stdDeviation = sqrt(-(radius^2)/(2*log10(1/255))); 
ind = -floor(radius/2):floor(radius/2); 
[X, Y] = meshgrid(ind, ind); 
[~, R] = cart2pol(X, Y); % Here R is defined 
h = exp(-R.^2/(2*stdDeviation*stdDeviation)); 
h = h/sum(h(:)); 
h(R > radius/2) = 0; 
h = h/sum(h(:)); 
redChannel = inputImage(:,:,1); 
greenChannel = inputImage(:,:,2); 
blueChannel = inputImage(:,:,3); 
redBlurred = conv2(redChannel, h); 
greenBlurred = conv2(greenChannel, h); 
blueBlurred = conv2(blueChannel, h); 
y = cat(3, uint8(redBlurred), uint8(greenBlurred), uint8(blueBlurred)); 

결과 : The implemented algorithm

GIMP's이 결과 : GIMP

완전히 질문에 대답 측면에서 같은 질문에 다른 사람들을 돕기 위해 나는 그것이 차이의 기원을 묻는 것이 유용 할 것이라고 생각한다.

감사합니다.

답변