2

근본적으로 이웃하는 셀 값의 가중치 평균을 취하는 이진 이미지에 필터를 적용하고 싶습니다. 이 부분은 이미 설정했습니다.가장자리를 따라 가중치가있는 요소를 변경하여 이미지 필터링

내 문제는 이제 내 이미지에 "가장자리"가있는 것입니다 (매트릭스 가장자리가 아님). 나는 이웃 요소들에 대해 가중치를두기를 원하지만, 관심있는 특정 요소들에 대해서만 그렇게하고자한다.

내가 아는 두 가지 접근법이있다. 어느 쪽이든 1) 가장자리가 디스크에 근접했을 때 디스크 필터의 무게를 변경하거나 2) 어떻게해서 가장자리 근처의 값을 반대쪽으로 반영/반사 시키십시오. 2)의 문제점은 내 가장자리가 직선이 아니며 모든 종류의 것이 어딘가에 있다는 것입니다. 여기

는 시나리오의 지나친 단순화이다

bin = [0 0 0 0 0 0 0 0 
     0 0 0 0 0 0 0 0 
     1 1 1 1 0 0 0 0 
     1 1 1 1 1 0 0 0 
     1 1 1 1 1 0 0 0 
     1 1 1 1 0 0 0 0 
     0 0 0 0 0 0 0 0 
     0 0 0 0 0 0 0 0]; 

mask = [0 0 0 0 0 0 0 0 
     0 0 0 1 1 1 0 1 
     1 1 1 1 1 1 1 1 
     1 1 1 1 1 1 1 1 
     1 1 1 1 1 1 1 1 
     1 1 1 1 1 1 1 1 
     0 0 1 1 0 0 0 0 
     0 0 0 0 0 0 0 0]; 

내가 bin에 필터를 적용 할하지만 난 단지 mask에서 1의 값을 가질 요소의 가중치를 먹고 싶어. bin은 반드시 가장자리의 비선형 성 때문에 미러링 할 수 없으므로 디스크 필터의 가중치로 변경하는 방법이 있어야합니다. 예를 들어 일반 디스크 필터에 20 개의 요소가있는 경우 각 요소의 가중치는 0.05입니다. 그러나 우리가 편평한 가장자리에 맞았다 고 가정 해 봅시다. 디스크 필터에있는 bin 값의 절반 만 mask에 1의 값을 갖습니다. 따라서 10 개의 요소가 있으며 각 요소의 가중치는 0.1입니다. 이와 같이 필터를 적용하는 비 반복적 인 방법이 있습니까?

답변

1

하나의 옵션 : bin의 모습

bin(~mask)=NaN; 

같은 것을 : 사전 처리 단계에서 NaN (숫자가 아님)를 사용

NaN NaN NaN NaN NaN NaN NaN NaN 
    NaN NaN NaN  0  0  0 NaN  0 
    1  1  1  1  0  0  0  0 
    1  1  1  1  1  0  0  0 
    1  1  1  1  1  0  0  0 
    1  1  1  1  0  0  0  0 
    NaN NaN  0  0 NaN NaN NaN NaN 
    NaN NaN NaN NaN NaN NaN NaN NaN 

그리고 필터링 루틴에서 nanmean를 사용합니다. 이러한 방식으로, 비 NaN 요소 만 평균의 계산에 포함되어 다른 수의 요소를 평균 처리합니다.

예 :

fun = @(x) nanmean(nanmean(x)); 
B = nlfilter(bin,[3 3],fun); 

결과 :

B = 

     0   0   0   0   0   0   0   0 
    0.6667 1.0000 0.8333 0.5000 0.1667   0   0   0 
    0.6667 1.0000 0.8889 0.6667 0.3333 0.1111   0   0 
    0.6667 1.0000 1.0000 0.8889 0.5556 0.2222   0   0 
    0.6667 1.0000 1.0000 0.8889 0.5556 0.2222   0   0 
    0.6667 0.8889 0.7778 0.6111 0.3889 0.1667   0   0 
    0.6667 0.8333 0.6667 0.3333 0.1667   0   0   0 
     0   0   0   0   0   0   0   0 
+0

내가 fspecial' '에서 파생 된 디스크 필터'imfilter'을 사용하고있는 경우, 어떻게 구현하는 것이'nanmean'? – Darrik

+0

@Darrik은 필터링 부분에 대한 편집을 참조하십시오. 원이 필요한 경우 블록 (현재 3x3)의 크기를 디스크 필터 'h'의 크기로 업데이트하고'fun = @ (x) nanmean (nanmean (x. * (h> 0)) '을 사용할 수 있습니다. '. –

+0

고마워요. 또 다른 빠른 질문입니다. 잘하면 당신은 여전히 ​​나를 도울 수 있습니다. 정상적인 블록을 사용한 첫 번째 결과는 다음과 같습니다. http://i.imgur.com/ddtBcgz.png 괜찮아 보이는군요. 하지만 내 원형 디스크 필터의 경우 다음과 같이 보입니다 : http://i.imgur.com/B7S2MwH.png 문제는 중간의 값이 1 대신 0.8이며 문제가있는 것처럼 보입니다. 또한 왼쪽 경계에 '대칭'옵션을 적용 할 수있는 방법이 있습니까? – Darrik

관련 문제