C++ OpenCV实现图像去阴影 | 您所在的位置:网站首页 › 如何去掉图片上的阴影 › C++ OpenCV实现图像去阴影 |
学更好的别人, 做更好的自己。 ——《微卡智享》 本文长度为1831字,预计阅读5分钟 前言 浏览OpenCV相关文章时看到了《基于OpenCV的图像阴影去除》,源码也是用pytyon实现的,分析了一下其原理,这篇我们用OpenCV的C++版来实现一下。 1 来源 原文链接:https://blog.csdn.net/qq_42722197/article/details/110790222 原文源码:https://github.com/kavyamusty/Shading-removal-of-images 本文用的图片也是源码中提供的测试图片。 #实现思路1图将转为灰度图2将灰度图进行膨胀操作3膨胀后的图再进行腐蚀操作4先膨胀后腐蚀后的图减去原灰度图再取反5将取反后的图使用归一化将白色背景修改贴近原图实现效果 从上图中可以看到,最左边为原图转换的灰度图,中间图为去掉阴影后再归一化后的图,最右边是直接通过去掉阴影实现的图。 代码实现 微卡智享 #include #include #include "CvUtils.h" using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src = imread("E:/DCIM/Test_image.jpg"); CvUtils::MatResize(src, 800, 520); //imshow("src", src); //1.将图像转为灰度图 Mat gray; cvtColor(src, gray, COLOR_BGR2GRAY); CvUtils::SetShowWindow(gray, "gray", 0, 30); imshow("gray", gray); //定义腐蚀和膨胀的结构化元素和迭代次数 Mat element = getStructuringElement(MORPH_RECT, Size(3, 3)); int iteration = 9; //2.将灰度图进行膨胀操作 Mat dilateMat; morphologyEx(gray, dilateMat, MORPH_DILATE, element, Point(-1, -1), iteration); //imshow("dilate", dilateMat); //3.将膨胀后的图再进行腐蚀 Mat erodeMat; morphologyEx(dilateMat, erodeMat, MORPH_ERODE, element, cv::Point(-1, -1), iteration); //imshow("erode", erodeMat); //4.膨胀再腐蚀后的图减去原灰度图再进行取反操作 Mat calcMat = ~(erodeMat - gray); CvUtils::SetShowWindow(calcMat, "calc", gray.cols*2, 30); imshow("calc", calcMat); //5.使用规一化将原来背景白色的改了和原来灰度图差不多的灰色 Mat removeShadowMat; normalize(calcMat, removeShadowMat, 0, 200, NORM_MINMAX); CvUtils::SetShowWindow(removeShadowMat, "dst", gray.cols, 30); imshow("dst", removeShadowMat); waitKey(0); return 0; } 说明如果只复制代码可以将CvUtils的引用都去掉,这个类中我写了几个静态函数,主要是加载的图像在当前屏幕分辨率下能够显示全,还有就是自己设定图像显示的区域位置。 源码地址https://github.com/Vaccae/OpenCVDemoCpp.git 点击下方的原文链接可以跳转到码云的源码地址。 完 扫描二维码 获取更多精彩 微卡智享 「 往期文章 」 OpenCV像素操作---将图片缩小后融入另一个图像 C++ OpenCV三种图像卡通化方法对比 .NET5 Blazor初探 |
CopyRight 2018-2019 实验室设备网 版权所有 |