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