2015-01-23 3 views
0

Я работаю над проектом OCR для своего локального языка Amharic, и я хочу обнаружить и удалить подчеркивание из образа документа .... У меня есть следующий код, но он может работать только для одного слова. может ли кто-нибудь сказать мне, как это сделать, используя профиль проецирования для всего текстового документа?Как удалить подчеркивания в изображении документа с помощью профиля проецирования?

class UnderLineRemoval 
{ 
    public static Bitmap removeUnderline(Bitmap bm) 
    { 
     //declarations 
     List<int> rowSum = new List<int>(); 
     int count = 0; 
     int roi = bm.Height/2; 
     Color pixelColor; 

     //perform horizontal projections for points below roi 
     for (int y = roi; y < bm.Height; y++) 
     { 
      for (int x = 0; x < bm.Width; x++) 
      { 
       pixelColor = bm.GetPixel(x, y); 

       if (pixelColor.R == 0 && pixelColor.G == 0 && pixelColor.B == 0) 
        count++; 
      } 
      rowSum.Add(count); 
      count = 0; 
     } 

     // check if the sums are greater than 70% of the image width 
     for (int i = 0; i < rowSum.Count; i++) 
     { 
      if (rowSum[i] > bm.Width * 0.7) 
      { 
       break; 
      } 
      roi++; 
     } 

     // return if no underline are detected 
     if (roi == bm.Height) 
      return bm; 

     // crop image if underline are detected 
     Rectangle cropRect = new Rectangle(0, 0, bm.Width, bm.Height - ((bm.Height)-(roi - 2))); 

     if (cropRect.Height ==0 && cropRect.Y == 0) 
      return bm; 

     bm = bm.Clone(cropRect, bm.PixelFormat); 

     return bm; 
    } 
} 
+0

Что делать, если текст на изображении слегка повернут, например. 2 °? –

+0

вы можете использовать алгоритмы обнаружения перекоса и коррекции ... но мой вопрос касается снятия подчеркивания .... –

ответ

0

Вы могли бы попытаться обнаружить горизонтальные линии в документе, применяя Hough Line Transform и «удаление» найденных строк по перекрашивать каждый пиксель из них с цветом фона документа (например, белый).

Используйте OpenCV в HoughLines() или HoughLinesP() метод: http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/hough_lines/hough_lines.html

Here вы можете найти пример, который показывает, как найти горизонтальные линии (смотрите внизу страницы).

Edit: Я забыл упомянуть, что есть некоторые C# обертки для OpenCV (например OpenCvSharp или Emgu CV)

0

Вы можете найти горизонтальную линию с морфологией, а затем замаскировать его.

threshold(candidate, candidate, 0, 255, CV_THRESH_BINARY | CV_THRESH_OTSU); 

Mat horiz; 
Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(candidate.cols/10, 1)); 

morphologyEx(candidate, horiz, cv::MORPH_OPEN, element); 
bitwise_and(candidate, ~horiz, candidate); 
Смежные вопросы