java - 如何使用 Opencv 检测具有不同对比度和背景颜色的图像边缘?
问题描述
我正在开发一个 Android 应用程序来检测所有图像轮廓并使用 Opencv 绘制它们。
我在同一张图片上进行测试,一切正常。
但是,一旦我更改了相同的图像但对比度不同,检测就会失败。
此外,我更改了另一个背景较暗的示例图像,但它再次失败。
这是代码:
Imgproc.cvtColor(mRGBA, mGray, Imgproc.COLOR_RGB2HSV);
Core.split(mGray, channels);
mGray = channels.get(1);
Imgproc.threshold(mGray, mGray, 50, 255, Imgproc.THRESH_BINARY);
Core.meanStdDev(mGray, mu, stddev);
Imgproc.GaussianBlur(mGray, mGray, new Size(5, 5), 5);
//Imgproc.Canny(mGray, mGray, 20, 80, 3, false);
Imgproc.Canny(mGray, mGray, mu.get(0, 0)[0], stddev.get(0, 0)[0], 3, false);
Mat kernell = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new Size(9,9));
Imgproc.morphologyEx(mGray, mGray, Imgproc.MORPH_CLOSE, kernell);
Imgproc.dilate(mGray, mGray, Imgproc.getStructuringElement(Imgproc.MORPH_CROSS, new Size(3, 3)));
这是第一个示例图像
处理结果
这是第二个示例图像
这是结果
我必须指出这样一个事实,如果我删除图像阈值,该算法对于不同光强度和不同对比度的同一图像非常有效,但仅适用于白色背景的图像。
有没有办法以通用的方式应用 Canny?
解决方案
通过使用 Opencv 的CLAHE技术,我设法在所有类型的图像上获得更好的结果,以增强图像对比度,剪辑限制为 1。
当然,剪辑限制变量取决于应用程序,1 对我来说几乎完美。
我删除了图像阈值。
这是我在应用GaussianBlur之前添加的内容:
CLAHE clahe = Imgproc.createCLAHE();
clahe.setClipLimit(1);
clahe.apply(mGray, mGray);
推荐阅读
- python - response.xpath().extract_first() 方法的问题
- java - How do I get the character before a specific character with regex?
- haskell - LiquidHaskell 在“Data.String”类型上运行良好但在“Data.Text”类型上运行良好的简单案例
- lotus-notes - Lotus Sametime Embedded - 窗口格式
- python - 将部分函数调用保存在 json 文件中
- python - 我是在 dataset.repeat() dataset.batch() 和 dataset.prefetch() 之前还是之后缓存数据集?
- java - 保存无线电组 onSavedInstance
- django - /course/expression-regular-django/ 'ContactCourses' 对象的 AttributeError 没有属性 'name'
- ruby-on-rails - Ice Cube 如何为每次发生设置持续时间
- python - 如何更改帧分辨率opencv python