Как да използвам OpenCV за премахване на нетекстови области от визитка? [затворено]

целта ми е да премахна всяка нетекстова област от сканирано изображение на визитна картичка, но не знам стъпките за извършване на това с помощта на OpenCV, следвах тези стъпки, но не знам дали това е правилното или не, също не знам не забелязвам промяна в изображението (остават области без текст) всяка идея ще бъде много полезна, благодаря.

1) конвертирайте изображението в сива скала

2) бинарно изображение

3) обърнете цветовете (cv::bitwise_not), за да имате текст с бели пиксели

4) Ерозира изображението (cv::erode)

5) откриване на ръбове с помощта на canny

6) откриване на текстови редове с помощта на hough transform (все още не)

код:

cv::Mat greyMat = [self.imageView.image CVGrayscaleMat];
cv::Mat bwMat;
cv::threshold(greyMat, bwMat, 128, 255, CV_THRESH_BINARY);
cv::bitwise_not(bwMat, bwMat);
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(2, 1));
cv::erode(bwMat, bwMat, element);
std::vector<cv::Point>points;
cv::Mat_<uchar>::iterator it=bwMat.begin<uchar>();
cv::Mat_<uchar>::iterator end=bwMat.end<uchar>();
for (; it!=end; ++it) 
if (*it) 
points.push_back(it.pos());
cv::RotatedRect box=cv::minAreaRect(cv::Mat(points));
plImage* smothedImage=new IplImage(bwMat); 
cvSmooth(smothedImage, smothedImage);
cvCanny(smothedImage, smothedImage, 10, 100);

person chostDevil    schedule 21.04.2012    source източник
comment
какво си пробвал Можете ли да опитате да стесните въпроса си до нещо конкретно, в противен случай предполагам, че това ще бъде затворено поради неконструктивност   -  person Charles Menguy    schedule 21.04.2012
comment

Опитвам се да изпратя избрани редове и колони на grdiview по имейл и за това използвам тази функция, за да го направя

Public Function gridhtm(ByVal gv As GridView) As String
        Dim sb As StringBuilder = New StringBuilder()
        Dim sw As StringWriter = New StringWriter(sb)
        Dim hw As HtmlTextWriter = New HtmlTextWriter(sw)
        gv.RenderControl(hw)
        Return sb.ToString
    End Function

и за изпращане на имейл изпращам имейл като този

 email("[email protected]", "[Cheque Approval] GM Finance Reviewed (" & TreeView2.SelectedValue & ")", "<b>Please find below the details of cheques prepared in favour of different parties.</b><br>" & _
                     gridhtm(GridView5))

Проблемът е, че когато е зададен имейл, той изпраща цялостния мрежов изглед към имейл като това изображение

въведете описание на изображението тук

В това има два реда, избрани с квадратче за отметка, а също така искам да пропусна някои колони като category nature, което означава, че искам да изпратя само избрани колони в имейл. Но нямам никаква идея как да управлявам това, така че моля, дайте някаква идея как да постигна това.

  -  person karlphillip    schedule 21.04.2012


Отговори (1)


един от начините за дефиниране на логото може да бъде частите на логото да съдържат по-дебели линии и по-големи петна от текстовите части.

Ако това е вярно, можете да премахнете логото по следния начин:

(Използвах imagemagick, за да генерирам следните примери, трябва да можете да направите същото с opencv)

0) праг на изображението (по избор)

   imagemagick: convert img0052ir.jpg -threshold 60% monochrome.png

изход от: convert img0052ir.jpg -threshold 60% monochrome.png

1) разширете изображението, докато всички букви изчезнат, но някои части от логото все още остават.

 orgImg = business card image 
 cvDilate (orgImg, curImg, null, Some_Value) // find a value that erases all letters but leaves the logo

or

 imagemagick:  convert monochrome.png -morphology dilate:3 diamond dilated.png

изход от connvert monochrome.png -morphology dilate:3 diamond dilated.png

2) условно ерозирайте разширеното изображение, като използвате оригиналното изображение като маска, докато логото бъде завършено отново.

Това означава, че изтривате разширеното изображение, но никога не задавате стойност на пиксела под стойността му в оригиналното изходно изображение. Използвате оригиналното изображение като маска, за да защитите части от изображението от промени.

това ще възстанови всички фигури, които все още имат останала част от семената, така че само логото

 // Not sure if opencv can use a mask in morphologial operations, 
 // but you can just use erode + max in a loop to achive the same effect albeit slower
 repeat
    lastImg = curImg
    cvErode (lastImg, curImg, null ,1)
    cvMax (curImg, orgImg, curImg)
 until lastImg == curImg

or

 imagemagick: convert dilated.png -morphology erode:20 diamond -clip-mask monochrome.png eroded.png

изход от convert dilated.png -morphology erode:20 diamond -clip-mask monochrome.png eroded.png

вече имате изображение САМО с логото и без текст, използвайте това изображение, за да премахнете логото

 imagemagick: convert eroded.png -negate img0052ir.jpg -compose plus -composite test.png

въведете описание на изображението тук

Както можете да видите, далеч не е перфектно. Може би си поиграйте с thresholding, dilation kernel и т.н. в opencv, за да видите дали това може да се подобри. Но се съмнявам, че има общо решение, което премахва всички лога и нито един текст

РЕДАКТИРАНЕ: добавени са някои снимки

person HugoRune    schedule 21.04.2012
comment
в стъпка 1) имате предвид ерозия, а не разширяване, нали? - person chostDevil; 22.04.2012
comment
какво означава (използване на оригиналното изображение като маска)? - person chostDevil; 22.04.2012
comment
@Patrick Jones: Добавих някои снимки и обяснения. - person HugoRune; 22.04.2012
comment
Обясних отговор на Opencv тук: stackoverflow.com/questions/10262600/ - person Abid Rahman K; 22.04.2012