千家信息网

OpenCV如何实现低对比度图像脏污区域检测

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍OpenCV如何实现低对比度图像脏污区域检测,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1. 低对比度图像脏污区域检测先上图:第一张图如果不是标注结果,我都没
千家信息网最后更新 2025年11月07日OpenCV如何实现低对比度图像脏污区域检测

这篇文章主要介绍OpenCV如何实现低对比度图像脏污区域检测,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

1. 低对比度图像脏污区域检测

先上图:



第一张图如果不是标注结果,我都没有发现脏污区域在哪里,第二张图还清晰一些,基本可以看出来图像靠近左边缘的位置有偏暗的区域,这就是我们所说的脏污区域了,也是我们要检测的区域。

标注结果图:


2. 实现方法介绍

这里介绍两种实现方法,
第一种是用C++实现参考博文的方法,即利用梯度方法来检测,具体步骤如下:

  • 对图像进行高斯模糊去噪,梯度计算对噪声很敏感;

  • 调用Sobel函数计算图像在x,y方向梯度;

  • 调用convertScaleAbs函数将x,y梯度图像像素值限制在0-255;

  • 调用addWeight函数将x,y梯度图像融合;

  • 调用threshold函数对融合图像进行二值化;

  • 使用先腐蚀、后膨胀的形态学处理方法对二值图像进行非脏污区域过滤;

  • 调用findContours方法查找脏污区域轮廓。

第二种方法是本人根据提高图像对比度思路实现的,具体步骤如下:
8. 对图像进行高斯模糊去噪;
9. 使用局部直方图均衡化方法来提高图像对比度;
10. 使用OTSU二值化阈值方法来粗略分割脏污区域;
11. 对二值图像使用腐蚀的形态学操作过滤掉部分非脏污区域;
12. 调用findContours方法查找脏污区域轮廓。

3. C++源码实现

#include #include #include #include #include #include int main(){        using namespace cv;        std::string strImgFile = "C:\\Temp\\common\\Workspace\\Opencv\\images\\led1.jpg";        Mat mSrc = imread(strImgFile);        CV_Assert(mSrc.empty() == false);        Mat mSrc2 = mSrc.clone();        CV_Assert(mSrc2.empty() == false);        Mat mGray;        cvtColor(mSrc, mGray, COLOR_BGR2GRAY);        GaussianBlur(mGray, mGray, Size(5, 5), 1.0);        Mat mGray2 = mGray.clone();        CV_Assert(mGray.empty() == false);        imshow("gray", mGray.clone());        //方法1:利用梯度变化检测缺陷        Mat mSobelX, mSobelY;        Sobel(mGray, mSobelX, CV_16S, 1, 0, 7);        Sobel(mGray, mSobelY, CV_16S, 0, 1, 7);        convertScaleAbs(mSobelX, mSobelX);        convertScaleAbs(mSobelY, mSobelY);        Mat mEdge;        addWeighted(mSobelX, 1, mSobelY, 1, 0, mEdge);        imshow("edge", mEdge);        Mat mThresh;        threshold(mEdge, mThresh, 0, 255, THRESH_BINARY | THRESH_OTSU);        imshow("thresh", mThresh);        Mat kernel1 = getStructuringElement(MORPH_RECT, Size(11, 11));        CV_Assert(kernel1.empty() == false);        Mat mMorph;        morphologyEx(mThresh, mMorph, MORPH_ERODE, kernel1);        imshow("erode", mMorph);        Mat kernel2 = getStructuringElement(MORPH_RECT, Size(5, 5));        morphologyEx(mMorph, mMorph, MORPH_DILATE, kernel2);        imshow("dilate", mMorph);        std::vector> contours;        findContours(mMorph, contours, RETR_EXTERNAL, CHAIN_APPROX_NONE);        for (int i = 0; i < contours.size(); i++)        {                float area = contourArea(contours[i]);                if (area > 200)                {                        drawContours(mSrc, contours, i, Scalar(0, 0, 255));                }        }        imshow("result1", mSrc.clone());        //方法2: 利用局部直方图均衡化方法检测缺陷        Ptr ptrCLAHE = createCLAHE(20, Size(30, 30));        ptrCLAHE->apply(mGray2, mGray2);        imshow("equalizeHist", mGray2);        Mat mThresh3;        threshold(mGray2, mThresh3, 0, 255, THRESH_BINARY_INV | THRESH_OTSU);        CV_Assert(mThresh3.empty() == false);        imshow("thresh", mThresh3);        Mat kernel2_1 = getStructuringElement(MORPH_RECT, Size(9, 9));        Mat mMorph3;        morphologyEx(mThresh3, mMorph3, MORPH_ERODE, kernel2_1);        CV_Assert(mMorph3.empty() == false);        imshow("morph3", mMorph3);        std::vector> contours2;        findContours(mMorph3, contours2, RETR_EXTERNAL, CHAIN_APPROX_NONE);        for (int i = 0; i < contours2.size(); i++)        {                float area = contourArea(contours2[i]);                if (area > 200)                {                        drawContours(mSrc2, contours2, i, Scalar(0, 0, 255));                }        }        imshow("result2", mSrc2);        waitKey(0);        destroyAllWindows();        system("pause");        return 0;}

4.结果

梯度方法检测结果:


局部直方图均衡化方法检测结果:


以上是"OpenCV如何实现低对比度图像脏污区域检测"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

方法 图像 区域 脏污 检测 梯度 对比度 结果 函数 均衡 局部 直方图 内容 形态 形态学 步骤 篇文章 缺陷 轮廓 高斯 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 维护国家网络安全论文2000字 服务器攻防和安全技巧 VB软件开发接单 华为公司从青阳建数据库 pop服务器地址 阿里云 深圳软件开发阮话题 大连网络安全认证服务平台 网络安全支持与促进演讲稿 我国的论文数据库平台 网站算软件开发吗 泸溪软件开发有限公司 软件开发测试是干什么的 软件开发背景及重要性怎么描述 东莞专业软件开发销售厂 嵌入式行业的专业软件开发 福建企业软件开发直销价格 网络安全管理岗位廉政风险 数据库技术的主要目的包括 软件开发过程使用范围 abb牡丹系列面板数据库文件 魔域服务器名字乱码 圣世火龙传奇服务器连接失败 网络安全小贴士 小知识 数据库随笔 中山2011年戴尔服务器质量 服务器管理口和网口怎么区分 滨州软件开发公司招 软件开发的基础知识和技能 桦南游戏软件开发 泰格安装软件提示未连接服务器
0