2

这些问题是对这个问题的后续,我有一张我想从中删除徽标的图像,我已经侵蚀了图像,直到所有小文本都消失了,只剩下徽标,现在我有两张图像,原始图像和仅带有徽标的图像,现在当我尝试减去这两个图像以形成第三个仅包含文本的图像时,发生了奇怪的事情,徽标没有被删除,但已被概述

代码:

cv::Mat final;
cv::Mat greyMat = [self.imageView.image CVGrayscaleMat];
cv::Mat bwMat,erodedMat;
cv::threshold(greyMat, bwMat, 128, 255, CV_THRESH_BINARY);
cv::bitwise_not(bwMat, bwMat);
cv::Mat element = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(20, 12));
cv::erode(bwMat, erodedMat, element);
cv::dilate(bwMat, erodedMat, bwMat);//I used this to restore all the missed components of    the logo  during erosion,bwMat in the last argument acts as a mask, i didn't sure of this
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());
final=bwMat-erodedMat;
4

1 回答 1

1

我认为这是因为当您侵蚀图像时,白色区域会缩小。这会擦除你的字母,同时它也会缩小白色方块的区域。

所以当你减去时,你是从原始正方形中减去一个缩小的正方形,留下你的边界。

所以在这种情况下,你必须做与腐蚀相反的功能,即膨胀。它扩大了白色区域。它不会带回您的信件,因为它们已经被删除。

但我认为你不能完全擦除白色方块,因为膨胀不会给出确切的方块。你可以比你的问题更好,仅此而已。

检查下面的这些图像。原图:

在此处输入图像描述

下面是先腐蚀后膨胀的结果:

在此处输入图像描述

它们永远不会相同。因此,当您减去它们时,就会出现伪影。

我在回答您的第一个问题时解释了另一种方法:如何使用 opencv 检测大量白色像素的区域?

于 2012-04-22T09:30:47.990 回答