仅突出显示掌纹图像中的折痕(主要线条和皱纹)

Posted

技术标签:

【中文标题】仅突出显示掌纹图像中的折痕(主要线条和皱纹)【英文标题】:Highlight only the creases (primary lines and wrinkles) in a palm print image 【发布时间】:2013-05-09 06:43:31 【问题描述】:

我有一张使用墨水和纸张拍摄的掌纹图像,如下图 (a)。 我需要突出显示折痕,保留折痕的宽度和方向,见图 (b)。

我尝试使用具有不同阈值的 Canny、Laplacian 和 Sobel 算子等边缘检测器,但无法得出 (b) 所示的清晰折痕图。但是当使用上述边缘检测器时,所有黑线都被检测为边缘。我想要的只是突出图像(a)中较粗的白线。我正在使用 OpenCV 2.4.5。任何人都可以帮忙吗?谢谢你。

【问题讨论】:

【参考方案1】:

这是我想出的方法:

cv::Mat im;    //Already loaded
cv::Mat grey;
cv::cvtColor(im, grey, CV_BGR2GRAY);

cv::Mat binary;
cv::threshold(grey, binary, 0, 255, cv::THRESH_OTSU);

//Create a mask of the hand region
cv::Mat mask;
cv::Mat kern = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(20,20));  //Large kernel to remove all interior detail
cv::morphologyEx(binary, mask, cv::MORPH_OPEN, kern);
cv::threshold(mask, mask, 128, 255, cv::THRESH_BINARY_INV);     //Invert colors

cv::imshow("", mask);

//Remove thin lines
cv::Mat blurred;
cv::GaussianBlur(grey, blurred, cv::Size(9,9), 0);  
cv::threshold(blurred, binary, 0, 255, cv::THRESH_OTSU);
cv::morphologyEx(binary, binary, cv::MORPH_OPEN, cv::noArray());

cv::Mat result;
binary.copyTo(result, mask);

结果如下:

蒙版边缘存在一些伪影,可以通过使用更复杂的蒙版方法进行补救。模糊和形态学操作的内核大小显然可以针对不同的细节级别进行修改。

【讨论】:

一使用THRESH_OTSU,整只手都变成了白色面膜。 @nurettin 检查手在什么背景上。 Otsu 的方法非常简单,可能会被图像的背景所迷惑。 在使用 THRESH_OTSU 之前,我只隔离了黑色背景上的手并将其转换为灰度。现在我正在尝试自适应高斯,并获得了更好的结果。 结果确实更好,但我最终得到了一个巨大的外围轮廓,类似于你图像中的轮廓,我必须摆脱它。我尝试使用 findcontours 并在其上绘制白色,但它仍然存在。也许我应该画两次相同的轮廓,偏移几个像素。【参考方案2】:

首先,您可以使用阈值将图像转换为二进制。

然后你可以应用一些形态学操作,比如腐蚀,这样就可以过滤细线,openCV中有一个内置的方法可以进行这个操作。

最后,您可以使用您提到的边缘检测器之一。

【讨论】:

以上是关于仅突出显示掌纹图像中的折痕(主要线条和皱纹)的主要内容,如果未能解决你的问题,请参考以下文章

仅突出显示 UILabel 中的文本

使用 .maphilight() 突出显示图像的特定区域

在 UIImage 上突出显示(覆盖)特定区域

给定具有多个边界框的图像,如何仅突出显示完全在另一个边界框内的那些边界框?

VSCode - 如何使用光标向线条添加突出显示?

如何在 Flutter 中仅突出显示 Text 中的数字和特殊字符?