2011-09-14 1 views
10

검은 색 & 흰색 이미지가 링크의 첫 번째 사진처럼 작동합니다. http://imageshack.us/g/33/firstwm.png/ "노이즈"가 많아서 부드럽게하기 위해 Median 필터를 적용하여 두 번째 그림을 얻었습니다.OpenCV에서 커브 (등고선)를 부드럽게하려면 어떻게해야합니까?

cvSmooth(TempImage, TempImage, CV_MEDIAN, 5, 0); 

이 후 윤곽을 얻고 링크의 세 번째 그림과 같은 다른 이미지에 그립니다. 내 문제는 윤곽선이 여전히 약간 픽셀 화 (초초)되어 있다는 것입니다. B & W 이미지를 더 부드럽게하여 더 좋은 윤곽을 얻을 수있는 방법이 있습니까? 또는 윤곽선으로 무언가를 할 수도 있습니다. 다른 커널에서도 Dilate와 Erode를 시도했지만 문제는 동일하게 유지됩니다. 도움을 주셔서 감사합니다.

편집 : 또한 시도 : 중간 필터로

cvSmooth(TempImage, TempImage, CV_GAUSSIAN, 9, 9, 3); 
cvThreshold(TempImage, TempImage, 127, 255, CV_THRESH_BINARY); 

같은 결과를 확인하지만, 여전히 일부 픽셀 화 윤곽을 떠난다. 이 후 당신 평활 결과 인 경우

+1

그것이 가장자리를 부드럽게해야 임계 화 한 후 가우시안 커널을 통해 전달하고 :

업데이트 2 윤곽 버전은 다음과 같이 될 것이다. 아마도 이것이 당신이 원하는 결과일까요? – swalog

+0

나는 당신이 말하는 "노이즈"가 두 번째 예제에서 제거한 것 같은 고주파 성분이라는 가정을하고 있습니다. [this] (http://i.imgur.com/33GIT.png)는 원하는 결과물입니까? 바이너리 출력 만 필요한 경우 [하드 임계 값] (http://i.imgur.com/VelRg.png)이 가장 가까운 것입니다. – swalog

+0

네, 원하는 출력은 가능한 한 부드러운 윤곽선을 가지고 노이즈를 제거하는 것입니다, 나는 당신의 제안에도 Gaussian + 임계 값을 시도했지만 메디아 필터와 같은 결과를 얻었습니다. – Adrian

답변

8

enter image description here

은, 그것은 임계 다음 가우시안 블러를 수행하여 얻을 수 있습니다. 나는. cvSmoothCV_GAUSSIAN을 매개 변수로 사용하십시오. cvThreshold이 계속됩니다.

임계 값보다 부드러운 전환 (예 : this)을 원할 경우 조정 레벨 (일부 색상 변이를 유지하도록 색상 범위를 다시 매핑)로 조정할 수 있습니다.

업데이트 thresholding에서 부드러운 (앤티 앨리어스) 에지를 얻는 방법을 설명하려면 임계 값이 무엇인지 고려하십시오. 기본적으로 이미지의 각 픽셀을 한 번에 하나씩 처리합니다. 픽셀 값이 임계 값보다 낮 으면 검정 (0)으로 설정되고 그렇지 않으면 흰색 (255)으로 설정됩니다.

임계 값 연산자는 매우 간단하지만 다른 일반적인 매핑 함수를 사용할 수도 있습니다. 기본적으로 함수 f(i)입니다. 여기에서 i은 강도 픽셀 값 (0-255 범위)이고 f(i)은 매핑 된 값입니다. 임계 값의 경우이 기능은 무엇 당신이 가진 것은 (그 의미가 있다면, 당신에게 "부드러운"스무딩을 제공하는 가우시안 커널을 사용하여 cvSmooth에 의해)을 부드럽게 이미지가

f(i) = { 0, for i < threshold 
      255, for i >= threshold 

간단하다. 따라서 0에서 255 사이의 가장자리에 부드러운 값을 전달할 수 있습니다.이 전환을 훨씬 작게 만들면 좋은 결과를 얻을 수 있습니다. 만약 탄도가 좋다면, 0에서 255까지 직접 이동합니다. 이것은 이미 수행 한 이진 임계 값과 같습니다.

이제 4 개의 밝기 값 (127 + - 4)의 범위를 0-255의 전체 범위로 매핑하는 기능을 고려해보십시오. 나는.

  f(i) = { 0, for i < 123 
        255, for i >= 131 
     linear mapping, for 123 <= i < 131 

그리고 원하는 출력을 얻습니다. 나는 openCV에서 이미 구현되었는지 살펴볼 것입니다. 그래도 코드를 작성하는 것은 너무 어렵지 않아야합니다.

   f(i) = { 255, for  i < 122 
    linear mapping (255->0), for 122 <= i < 126 
         0, for 126 <= i < 127 
    linear mapping (0->255), for 127 <= i < 131 
         255, for 131 <= i 
+0

아, 내가 지금 이해 당신이 무슨 말을하는지 내 대답 : 업데이트 부드러운 :) – Adrian

+0

평활화 작업 후에 부드러운 그라디언트 가장자리가있는 것을 고려하십시오. cvLUT와 올바른 테이블 값을 사용하여 멋진 윤곽선 이미지를 얻을 수 있어야합니다. 즉, 흰색에서 검은 색까지 세 가지 범위를 갖습니다. 라인의 시작)과 검은 색 (라인 안쪽)과 검은 색에서 흰색 (라인의 끝)에 이르기까지 모두 같습니다. 위와 동일한 구조를 따르는 경우이 바깥의 모든 값도 흰색으로 매핑됩니다. 등고선 :) – swalog

+0

답변에서 업데이트 2를 참조하십시오. 나는 또한 좋은 가치를 추측하고 있기 때문에 주위를 놀고 싶어 할 수도 있습니다 :) – swalog