2014-09-23 63 views
3

我使用OpenCV進行圖像預處理。我只需要掃描照片,而不是白色區域。 我使用algoritm:掃描圖像上的文檔檢測OpenCV

  • image_canny < - 應用Canny邊緣檢測器,用於該信道
  • 用於閾值在bunch_of_increasing_thresholds:
  • image_thresholds [閾] < - 應用閾值,以該信道 在找到的每個輪廓{ image_canny} U image_thresholds:
  • 近似輪廓與多邊形
  • 如果近似有四個角並且角度接近90度。 d掃描圖像上的矩形對象。但是這個例子不起作用,如果我把我的照片放在掃描儀的角落裏!

有人可以提醒,我怎麼能在掃描的圖像上找到這張照片?任何示例,方法?

+1

如果您分享一些樣本圖片或其他相關圖片,效果會更好。 – 2014-09-24 07:54:29

+0

Thx編輯!當然,我附上樣品:[樣品1](http://s019.radikal.ru/i632/1409/e3/9b867ca286a7.jpg),[樣品2](http://i003.radikal.ru/1409/12/990fc8613b1f .JPG) – 2014-09-25 00:12:49

回答

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. 您有對象和幾乎白色的背景。你可以做任何閾值操作,然後採取最大的一團。

更新。 在這兩種情況下,圖像頂部的黑線和左角的黑色區域仍然可能是問題。在這種情況下,你可以通過該功能

double Cv2.ContourArea(Point[] Contour); 

選擇面積最大的輪廓,然後嘗試創建邊框,這將最大限度地減少錯誤。