2

これらの質問はこれに続くものです。ロゴを削除したい画像があります。小さなテキストがすべてなくなり、ロゴだけが残るまで画像を浸食しました。今は 2 つの画像があります。元の画像とロゴのみの画像、3 つ目の画像を作成するために 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 に答える