前言
瀏覽OpenCV相關文章時看到了《基于OpenCV的圖像陰影去除》,源碼也是用pytyon實現(xiàn)的,分析了一下其原理,這篇我們用OpenCV的C++版來實現(xiàn)一下。
實現(xiàn)思路:
圖將轉為灰度圖
將灰度圖進行閉運算操作
閉運算后的圖減去原灰度圖再取反
將取反后的圖使用歸一化將白色背景修改貼近原圖
關注機器視覺課堂持續(xù)學習
opencv實現(xiàn):
Mat src = imread("D:/opencv練習圖片/去陰影.png");
imshow("原圖", src);
//1.將圖像轉為灰度圖
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
//定義腐蝕和膨脹的結構化元素和迭代次數(shù)
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
int iteration = 9;
//2.將灰度圖進行閉運算操作
Mat closeMat;
morphologyEx(gray, closeMat, MORPH_CLOSE, element, Point(-1, -1), iteration);
imshow("閉運算", closeMat);
//4.閉運算后的圖減去原灰度圖再進行取反操作
Mat calcMat = ~(closeMat - gray);
imshow("calc", calcMat);
//5.使用規(guī)一化將原來背景白色的改了和原來灰度圖差不多的灰色
Mat removeShadowMat;
normalize(calcMat, removeShadowMat, 0, 200, NORM_MINMAX);
imshow("dst", removeShadowMat);
原圖:
去陰影: