实现思路:
- 图将转为灰度图
- 将灰度图进行闭运算操作
- 闭运算后的图减去原灰度图再取反
- 将取反后的图使用归一化将白色背景修改贴近原图
opencv实现:
1 Mat src = imread("D:/opencv练习图片/去阴影.png"); 2 imshow("原图", src); 3 //1.将图像转为灰度图
4 Mat gray; 5 cvtColor(src, gray, COLOR_BGR2GRAY); 6 //定义腐蚀和膨胀的结构化元素和迭代次数
7 Mat element = getStructuringElement(MORPH_RECT, Size(3, 3)); 8 int iteration = 9; 9 //2.将灰度图进行闭运算操作
10 Mat closeMat; 11 morphologyEx(gray, closeMat, MORPH_CLOSE, element, Point(-1, -1), iteration); 12 imshow("闭运算", closeMat); 13 //4.闭运算后的图减去原灰度图再进行取反操作
14 Mat calcMat = ~(closeMat - gray); 15 imshow("calc", calcMat); 16 //5.使用规一化将原来背景白色的改了和原来灰度图差不多的灰色
17 Mat removeShadowMat; 18 normalize(calcMat, removeShadowMat, 0, 200, NORM_MINMAX); 19 imshow("dst", removeShadowMat);
原图:
😃我们可以看到 这里的形态学的妙用:
在对原图进行闭运算以后,可以发现我们就得到了只有阴影的图像。