java - OpenCV - Canny 边缘检测无法正常工作

标签 java android opencv image-processing edge-detection

我是 Android 版 OpenCV 的新手。我目前正在开发文档检测演示应用程序。到目前为止我所做的如下:

原图 -> 灰度图 -> GaussianBlur -> Canny边缘检测 -> 寻找轮廓 -> 绘制轮廓

我能够完美地检测到纸张,如下图所示。

enter image description here

但是它没有检测到一些文件。下面是其中之一

enter image description here

我对此进行了很多研究,发现问题出在精明的边缘检测上,下面是精明的图像:

enter image description here

如您所见,边缘检测并没有完美连接,并且在某些点上没有连接边缘。这就是原因所在。

我在 How to select the best set of parameters in Canny Edge detection algorithm implemented in OpenCV? 遇到过类似的问题 我已经遵循了解决方案,但它对我没有用。

我的精明检测代码如下:

double otsu_thresold = Imgproc.threshold(mGray,edged,0,255, Imgproc.THRESH_OTSU);
Imgproc.Canny(mRgba, edged, otsu_thresold*0.5,otsu_thresold);

我不知道我哪里错了!我应该怎么做才能完美检测文档?

最佳答案

首先,执行Canny 边缘检测 的方法必须改变。您正在 cv2.Canny()手动 中设置较低和较高的阈值。您可以自动执行此操作。我用了THIS LINK作为引用。

使用以下代码段:

v = np.median(gray_image)

#---- apply automatic Canny edge detection using the computed median----
lower = int(max(0, (1.0 - sigma) * v))
upper = int(min(255, (1.0 + sigma) * v))
edged = cv2.Canny(gray_image, lower, upper)
cv2.imshow('Edges',edged)

那我在这里做什么?

我取的是灰度图像的中值值。选择 0.33 的 sigma 值来设置 lowerupper 阈值。 0.33 值通常被统计学家用于数据科学。所以这里也考虑了。

这是我得到的:

enter image description here

为了增强此边缘信息,我使用 cv2.MORPH_CROSS 内核执行了形态膨胀:

enter image description here

现在只需执行通常的 cv2.findContours() 操作并绘制最大轮廓。

:)

关于java - OpenCV - Canny 边缘检测无法正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41893029/

相关文章:

java - 设计 : How to handle illegal console inputs with Scanner?

android - Games.Players.getCurrentPlayer崩溃

java - Androidx ViewPager2 不兼容类型 : ViewPagerAdapter cannot be converted to Adapter

python - 为什么 tesseract 无法提取黑色背景的文本?

c++ - OpenCV 中用于不失真图像的重映射功能如何工作?

java - 用java发出硬盘命令

java - 在 Kotlin/Java 中寻找 .properties 和 .y(a)ml 文件的属性解析器,就像在 Spring 中一样

java - 如何使用 JPA 持久保存 Map<String, Map<String, String>> ?

java - 如何计算上传任务的百分比

python - 类型错误 : imwrite() takes 2 positional arguments but 3 were given