Как использовать OpenCV для удаления нетекстовых областей с визитной карточки?

моя цель - удалить любую нетекстовую область из отсканированного изображения визитной карточки, но я не знаю, как это сделать с помощью OpenCV, я выполнил эти шаги, но не знаю, правильно это или нет. не заметил никаких изменений в изображении (остались нетекстовые области) любая идея будет очень полезна, спасибо.

1) преобразовать изображение в оттенки серого

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

3) инвертировать цвета (cv::bitwise_not), чтобы текст был белым.

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

5) обнаружить края, используя хитрость

6) обнаружить текстовые строки, используя преобразование hough (пока нет)

код:

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
Пожалуйста, предоставьте образец изображения, @PatrickJones   -  person karlphillip    schedule 21.04.2012


Ответы (1)


один из способов определить логотип может заключаться в том, что части логотипа содержат более толстые линии и большие пятна, чем текстовые части.

Если это так, вы можете удалить логотип следующим образом:

(Я использовал imagemagick для создания следующих образцов, вы сможете сделать то же самое с opencv)

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

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

вывод: конвертировать img0052ir.jpg -порог 60% монохромный.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

выходные данные преобразования монохромный.png -морфология расширения: 3 ромба расширенный.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

результат конвертации dilated.png -morphology erode:20 diamond -clip-mask монохромный.png erode.png

теперь у вас есть изображение ТОЛЬКО с логотипом и без текста, используйте это изображение, чтобы удалить логотип

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

введите здесь описание изображения

Как видите, он далек от совершенства. Возможно, поиграйте с пороговым значением, ядром расширения и т. Д. В 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 здесь: « title = «как определить область больших белых пикселей с помощью opencv»> stackoverflow.com/questions/10262600/ - person Abid Rahman K; 22.04.2012