C++ OpenCV实现图像去阴影 您所在的位置:网站首页 如何去掉图片上的阴影 C++ OpenCV实现图像去阴影

C++ OpenCV实现图像去阴影

2024-06-25 05:42| 来源: 网络整理| 查看: 265

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为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 实验室设备网 版权所有