2014-04-04 3 views
1

감지 된 곡선을 나타내지 않는 "흰색"인공물을 제거해야하는 이미지가 있습니다. 커브를 나타내는 흰색 픽셀을 유지하려고하지만 커브에서 멀리 떨어져있는 픽셀 이상 값을 제거합니다. 이슈를 제거한 후 이미지의 점들에 부드러운 곡선을 맞추고 싶습니다.OpenCV - 이미지에서 "흰색"이슈를 제거하고 곡선에 맞 춥니 다.

white detected curve

이미지는 검은 색과 흰색 점과 8 비트 그레이 스케일 이미지 이미지는 다음과 같습니다

이 내 이미지입니다. "곡선"의 흰색 픽셀은 관심 영역이며 대부분이 단일 픽셀 두께입니다. 일부 흰색 픽셀은 서로 연결되어 있지만 전부는 아닙니다. 일부 흰색 픽셀이 흩어져 있습니다. 이 흰색 픽셀은 부드러운 곡선을 그들에 맞추기 위해 전체 모양에 영향을 미치지 않으므로이 흰색 픽셀을 제거하고 싶습니다.

지금까지 dilation을 시도한 결과 erosion, closingblack hat 연산을 수행했습니다. 그들 중 아무도 나에게 내가 기대하는 결과를주는 것 같지 않다. 또한 이미지의 모든 점을 반복하면서 밝은 점을 찾고 픽셀 주변의 3x3 근처를보고 값이 0으로 설정되면 그 자체가 동일한 이웃을 두 개 이상 가지지 않았습니다.

원하는 결과를 얻으려면 어떻게해야합니까? 또한 최종 "깨끗한"결과물을 얻었 으면 이미지의 점에 어떻게 부드러운 곡선을 맞출 수 있습니까?

+0

커브의 구성 요소를 유지하면서 더 큰 침식이 이어지면 대부분의 아티팩트가 제거되어야한다고 생각합니다. 커브를 맞추기 위해 Hough 투표 방식을 시도해 볼 수 있습니다. – ChronoTrigger

+0

@ChronoTrigger 아니, 그게 더 나쁘다. 검출 된 표면이 완전히 사라지면 필요한 것보다 많은 픽셀이 소음으로 간주됩니다. 감지 된 가장자리를 보존하는 방법을 찾고 있습니다. 연결된 구성 요소 접근법과 비슷할 수 있습니까? – Eagle

+0

@ChronoTrigger Hough Voting 제도 란 무엇입니까? 내가 배울 수있는 곳에서 문서/구현에 대한 몇 가지 링크가 있습니까? – Eagle

답변

0

커브를 맞추는 방법을 모르겠습니다. 다른 질문에서이 질문을하는 것이 좋습니다.


노이즈 정보 :이 기능은 트릭을 수행해야하며 블랙 및 대기 이미지의 노이즈를 제거하는 데 사용했습니다. 이 책에서 코드 샘플입니다 : 실용 컴퓨터 비전 프로젝트와

마스터 OpenCV의 - 다니엘 Lelis 바조는

나는이이 기능을 인스턴스화 헤더에 추가 포함했다 :

#include "opencv2/opencv.hpp" 
#include <stdio.h> 
#include <iostream> 
#include <vector> 

using namespace cv; 
using namespace std; 

마스크는 필터링하려는 이미지이며 분석 된 이미지 주위의 5 픽셀에 점이없는 도트를 제거합니다. 희망 사항 s

void removePepperNoise(Mat &mask) 
{ 
// For simplicity, ignore the top & bottom row border. 
for (int y=2; y<mask.rows-2; y++) { 
    // Get access to each of the 5 rows near this pixel. 
    uchar *pThis = mask.ptr(y); 
    uchar *pUp1 = mask.ptr(y-1); 
    uchar *pUp2 = mask.ptr(y-2); 
    uchar *pDown1 = mask.ptr(y+1); 
    uchar *pDown2 = mask.ptr(y+2); 

    // For simplicity, ignore the left & right row border. 
    pThis += 2; 
    pUp1 += 2; 
    pUp2 += 2; 
    pDown1 += 2; 
    pDown2 += 2; 
    for (int x=2; x<mask.cols-2; x++) { 
     uchar v = *pThis; // Get the current pixel value (either 0 or 255). 
     // If the current pixel is black, but all the pixels on the 2-pixel-radius-border are white 
     // (ie: it is a small island of black pixels, surrounded by white), then delete that island. 
     if (v == 0) { 
      bool allAbove = *(pUp2 - 2) && *(pUp2 - 1) && *(pUp2) && *(pUp2 + 1) && *(pUp2 + 2); 
      bool allLeft = *(pUp1 - 2) && *(pThis - 2) && *(pDown1 - 2); 
      bool allBelow = *(pDown2 - 2) && *(pDown2 - 1) && *(pDown2) && *(pDown2 + 1) && *(pDown2 + 2); 
      bool allRight = *(pUp1 + 2) && *(pThis + 2) && *(pDown1 + 2); 
      bool surroundings = allAbove && allLeft && allBelow && allRight; 
      if (surroundings == true) { 
       // Fill the whole 5x5 block as white. Since we know the 5x5 borders 
       // are already white, just need to fill the 3x3 inner region. 
       *(pUp1 - 1) = 255; 
       *(pUp1 + 0) = 255; 
       *(pUp1 + 1) = 255; 
       *(pThis - 1) = 255; 
       *(pThis + 0) = 255; 
       *(pThis + 1) = 255; 
       *(pDown1 - 1) = 255; 
       *(pDown1 + 0) = 255; 
       *(pDown1 + 1) = 255; 
      } 
      // Since we just covered the whole 5x5 block with white, we know the next 2 pixels 
      // won't be black, so skip the next 2 pixels on the right. 
      pThis += 2; 
      pUp1 += 2; 
      pUp2 += 2; 
      pDown1 += 2; 
      pDown2 += 2; 
     } 
     // Move to the next pixel. 
     pThis++; 
     pUp1++; 
     pUp2++; 
     pDown1++; 
     pDown2++; 
    } 
} 
+0

흰색 픽셀을 제거하고 싶지 않습니다. 커브에서 흰색 픽셀의 구조를 유지하려고하지만 커브에서 멀리 떨어져있는 이상한 흰색 픽셀을 제거하고 싶습니다. 귀하의 코드가 무엇을하려고하는지 잘 모르겠습니다 만, 그것이 효과가 있는지 보려고 노력할 것입니다. – Eagle

+0

이 코드는 이미지에서 5x5 블록의 단일 '검은 픽셀'을 제거합니다 (노이즈를 검정으로 사용했을 때). 나는 당신이 당신의 선과 같은 비율의 픽셀 섬을 가지고 있다는 것을 알아 채지 못했습니다. 나쁜 접근법에 대해 유감스럽게도 문제가 해결되지 않습니다. – nico

+0

코드가 올바른 방향으로 나를 가리켰다. 그 후 아이디어를 가지고 대각선을 가로 지르는 픽셀을 찾으십시오. http://stackoverflow.com/questions/22898881/opencv-fit-a-curve-to-a-set-of-points. 선분을 사용하여 커브를 근사 할 때 출력이 좋게 보입니다. 그러나 이상적인 모든 것을 제거 할 수는 없으므로 이상적인 곡선이 좋아질 것입니다. 어떻게 든 실제로 커브를 적절하게 맞출 수 없다면 나는 이제 어떻게 든 상쇄해야합니다. – Eagle

관련 문제