2013-06-14 2 views
2

시작하기 전에 커널 이미지와 conv2() 함수를 사용하여 이미지를 필터링하는 방법을 이해하고 있음을 분명히 밝히고 싶습니다.하지만 각 필터를 호출하여 수동으로 처리해야합니다. 픽셀.수동 평균 필터링

여기 내 목표는 커널 또는 conv2()를 사용하지 않고 각 픽셀을 불러와 이웃을 찾고 평균화하고 이전 값을 획득 한 평균으로 바꾸는 것입니다. 지금까지

for 
    I = 1:512; 
    for 
     J = 1:683; 
A = myimage; 
neighbor_offsets = [-1, A, 1, -A, A + 1, -A + 1, -A-1, A - 1]; 
idx = [I J]; 
neighbors = bsxfun(@plus,idx,neighbor_offsets); 

를 사용하여 각 픽셀의 이웃을 찾기 위해 시도했지만 작동하지 않는 것, 나는 조금 그것을 해결하기 위해 노력 손실입니다. 나는 다음

sum(neighbors)/9 

같은 것을 사용하여 이웃을 얻을 그 답을 이전 값을 대체 할 수 있다면 나는이 작업을 완료 할 수 있다고 생각하지만, 난 경우에 저를 수정하시기 바랍니다. 나는 가난한 질문을하는 경향이 다소 발전 했으므로 명확하지 않은 점이 있으면 알려 주시기 바랍니다. 그래서 당신을 명확히 할 수 있습니다. 감사합니다

답변

1

아래의 예는 안에있는 이미지 만 인 이미지를 고려하여 가장자리의 픽셀을 처리합니다. 예를 들어, 프로그램이 왼쪽 상단 모서리에 커널 dy = (-1:1)dx = (-1:1)을 사용하여 평균을 계산할 때 왼쪽 위 모서리와 그 바로 옆에있는 3 개의 이웃 (오른쪽, 오른쪽 하단, 오른쪽) 만 고려하여 평균 4 픽셀을 계산합니다.

Matlab의 명령 창에서 모든 행을 개별적으로 테스트하여 동작을 확인하는 것이 좋습니다! 당신은이 내용 mean_filter.m 파일을 생성하여 위의 코드에서 함수를 만들 수 있습니다

% find image size 
imsz = size(myimage); 

% initialize output image 
imavg = zeros(imsz); 

% iterate over pixels 
for yy = 1 : imsz(1) 
    for xx = 1 : imsz(2) 

     % define rectangle-kernel width 
     dy = (-1:1); % 1 up, to 1 down and ... 
     dx = (-1:1); % 1 left, to 1 right from current pixel 

     % get indexes of image 
     indy = yy + dy; 
     indx = xx + dx; 

     % [!!!] keep indexes that are inside image 
     indy = indy(indy>0 & indy<=imsz(1)); 
     indx = indx(indx>0 & indx<=imsz(2)); 

     % create all the pairings of chosen indexes 
     [ IY, IX ] = meshgrid(indy, indx); 

     % take all values of chosen pixels 
     pixs = myimage(sub2ind(imsz,IY(:),IX(:))); 

     % save mean of chosen pixels to the given location 
     imavg(yy,xx) = mean(pixs); 
    end 
end 

: 그것은에 어디

function imagv = mean_filter(myimage) 

    % code from above ... 

당신은 디렉토리에 자신을 배치하여 명령 창에서 함수를 호출 할 수 있습니다 및 filtered = mean_filter(myimage);을 실행 중입니다.


반복적으로 동일한 이미지를 필터링 할 수 있습니다

filtered_3_times = myimage; 
for ii = 1 : 3 
    filtered_3_times = mean_filter(filtered_3_times); 
end 
+0

당신이 내 질문에 대답하는 시간을 가지고,하지만 난 당신의 코드에 의해 완전히 혼란 스러워요 감사합니다, 정확히이 일의 최종 결과는 무엇인가 ? – user2475404

+1

최종 결과는'imavg'에 포함되어 있습니다. 이 코드를 테스트하는 방법은 Matlab의 콘솔로 가서 차례로 입력하고 결과를 관찰하는 것입니다 : ** 1. **'imsz = size (myimage)'** 2. **'imavg = 0 (imsz); ** dy = (-1 : 1) ** ** 6. **'dx = (- 1) 1 : 1)''indy = yy + dy' ** 8. **'indx = xx + dx' 등 명령 끝 부분에';' 모든 계산 단계에서 부분적인 결과를 관찰하십시오. – plesiv

+0

코드가 완벽하게 작동했습니다. 감사합니다. 작은 것, 평균 필터를 다시 실행하고 싶다면 무엇을 추가해야합니까? 동일한 방법으로 평균값과 같은 새로운 값을 얻었습니까? matlab에 "반복"기능을 찾을 수 없습니다. – user2475404