2014-09-23 4 views
3

이미지 사전 처리를 위해 OpenCV를 사용합니다. 나는 흰 부분이없는 스캔 한 사진 만 잘라야합니다. I는 알고리즘으로 사용스캔 이미지에서 문서 감지 OpenCV

  • image_canny < - bunch_of_increasing_thresholds에서 임계치에 대한이 채널
  • 에 영리한 에지 검출기를 적용
  • image_thresholds [액] < - 검색된 각각의 형상이 채널 에 임계 값을 적용 { 이미지 _ 임계 값 : U 이미지 _ 임계 값 :
  • 대략 다각형이있는 등고선
  • 근사가 네 모서리이고 각도가 90도에 가까울 경우. 핀 d 스캔 ​​된 이미지의 사각형 개체. 하지만 스캐너의 모서리에 그림을 넣으면이 예제가 작동하지 않습니다!

아무도 내가 스캔 한 이미지에서이 사진을 찾을 수있는 조언을 할 수 있습니까? 어떤 예, 방법?

+1

몇 가지 샘플 이미지 또는 다른 관련 이미지를 공유하는 것이 좋습니다. –

+0

편집 용 Thx! 물론 샘플 첨부 : [sample1] (http://s019.radikal.ru/i632/1409/e3/9b867ca286a7.jpg), [sample2] (http://i003.radikal.ru/1409/12/990fc8613b1f .jpg) –

답변

0

목표를 달성하는 데는 여러 가지 방법이 있습니다. 나는 OpenCvSharp를위한 코드를 제공 할 것이고, 그것은 일반 C++과 비슷할 것이다.

  1. 이미지 주위에 중립적 인 경계선을 추가하십시오. 예를 들어, 원본 이미지 주위에 10-20 픽셀의 흰색을 추가 할 수 있습니다. 허위 윤곽을 만들 수 있지만 이미지의 대상 부분은 더 이상 구석에 있지 않습니다.

    Mat img = Cv2.ImRead("test.jpg"); 
    Mat imgExtended = new Mat(new OpenCvSharp.Size(img.Size().Width + 40, img.Size().Height + 40), MatType.CV_8UC3, Scalar.White); 
    OpenCvSharp.Rect roi = new OpenCvSharp.Rect(new OpenCvSharp.Point(20, 20), img.Size()); 
    img.CopyTo(imgExtended.SubMat(roi)); 
    img = imgExtended; 
    Mat coloredImage = img.Clone(); 
    Cv2.CvtColor(img, img, ColorConversionCodes.BGR2GRAY); 
    OpenCvSharp.Point[][] contours; 
    HierarchyIndex[] hierarchy; 
    Cv2.Canny(img, result, 80, 150); 
    Cv2.FindContours(result, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple); 
    
  2. 당신은 사실상 흰색 배경을 가지고 있습니다. thresholding 작업을 수행 한 다음 가장 큰 blob을 가져올 수 있습니다.

업데이트. 두 경우 모두 이미지 상단에 어두운 선이 있고 왼쪽 모서리에 어두운 영역이 여전히 문제가 될 수 있습니다. 이 경우 기능

double Cv2.ContourArea(Point[] Contour); 

하여 큰 지역에 윤곽을 선택하고 오류를 최소화 할 수있는 경계 상자를 만들려고 할 수 있습니다.