2012-11-06 2 views
1

나는 이미징 처리에 초보자이며 이미지 스무딩을 구현하는 데 어려움을 발견했습니다.matlab image smoothing with conv2

기본적으로 이미지 A가 있고 모든 픽셀을 현지 평균으로 바꾸고 싶습니다. 그래서 마스크 M1 = 1을 정의하고 사용하십시오.

newImage = conv2(A, M1,'same') 

잘 작동합니다. 그러나 이미지 A에는 노이즈 때문에 완전히 의미없는 픽셀이 있으며 평균에 포함하지 않으려합니다. 의미있는 픽셀이 다른 마스크 M2를 통해 정의되었다고 어떻게 할 수 있습니까?

이미지 위에 간단한 루프를 만들었습니다. 그것은 작동하지만 conv2()보다 느립니다.

for i = 1:self.row 
    for j = 1:self.col 
     if self.M2(i,j) % only treat meaningful pixels 
      A(i,j) = self.createAvgPhasor(i,j); 
     end 
    end 
end 

    function [s_avg]=createAvgPhasor(self,m,n) 
     % bound box along x 
     if m > self.rB 
      xl = m - self.rB; 
     else 
      xl = 1; 
     end 
     if m < self.row_rB 
      xu = m + self.rB; 
     else 
      xu = self.row; 
     end 
     % bound box along y 
     if n > self.rB 
      yl = n - self.rB; 
     else 
      yl = 1; 
     end 
     if n < self.col_rB 
      yu = n + self.rB; 
     else 
      yu = self.col; 
     end 
     M1 = false(self.row,self.col); 
     M1(xl:xu,yl:yu) = true; 
     msk = M1 & self.M2; 
     s_avg = mean(self.Phi(msk)); 
    end 

대단히 감사합니다.

+0

그래서 의미없는 픽셀로 무엇을하고 싶습니까? 그것들을 평균으로 바꾸고 싶지만 평균에 포함시키지 않으시겠습니까? 당신은 그들을 그대로 검은 색으로 바꾸고 싶습니까? – Ali

+0

노이즈 픽셀의 값은 신경 쓰지 않습니다. 결국 0으로 설정할 수 있습니다. 평균에서 그들을 제외하면 내가 원하는 것입니다. – nos

+0

그래, 내 대답을 업데이 트, 잘하면이 도움이, – Ali

답변

0

회선에서 나쁜 점을 제외하면 쉽습니다. M2가 포함 할 픽셀의 1, 당신은 그렇지 않은 사람들을 위해 0이 포함 된 경우 다음 당신은이 작업을 수행 :

newImage = conv2(A.*M2, M1,'same'); 

이 당신의 목적을 위해 충분한 수 있습니다,하지만 당신은 결정해야 정확히 '이 같은 것을 수행 할 수 있습니다 마지막에, 당신의 커널 인 ones(10) 주어진 예를 들어, "평균 무엇을 의미 :

npts = conv2(ones(size(A)).*M2, M1, 'same') 
newImage = newImage./npts 

즉, 실제로 포함 된 픽셀의 수에 의해 각 픽셀을 분할합니다. 그 픽셀의 컨볼 루션에서.

실제로 위 내용은 다른 점에 다르게 적용하더라도 올바른 결과를 얻을 수 있습니다. 그러나 그것은 정말로 당신이하고 싶은 일에 달려 있습니다.

0

빠른 해결 방법 중 하나는 마스크 된 픽셀의 모든 값을 총 평균으로 대체하는 것입니다.

더 세련된 방법은 이미지와 함께 큰 (매우 큰) 스무딩 필터 (이미 사용하지만 더 큰 것)를 콘볼 루션하여 원본 이미지의 마스크 된 픽셀을 채우기 위해 결과를 사용하는 것입니다. 원본 이미지의 가려진 픽셀에 대해 합리적인 값을 가지고 있다면, 이제 컨볼 베이션을 사용할 수 있습니다.