Python如何实现特定场景去除高光算法
短信预约 -IT技能 免费直播动态提醒
这篇文章主要介绍了Python如何实现特定场景去除高光算法,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。
算法思路
求取源图I的平均灰度,并记录rows和cols;
按照一定大小,分为N*M个方块,求出每块的平均值,得到子块的亮度矩阵D;
用矩阵D的每个元素减去源图的平均灰度,得到子块的亮度差值矩阵E;
通过插值算法,将矩阵E差值成与源图一样大小的亮度分布矩阵R;
得到矫正后的图像result=I-R;
应用场景
光照不均匀的整体色泽一样的物体,比如工业零件,ocr场景。
代码实现
import cv2import numpy as np def unevenLightCompensate(gray, blockSize): #gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) average = np.mean(gray) rows_new = int(np.ceil(gray.shape[0] / blockSize)) cols_new = int(np.ceil(gray.shape[1] / blockSize)) blockImage = np.zeros((rows_new, cols_new), dtype=np.float32) for r in range(rows_new): for c in range(cols_new): rowmin = r * blockSize rowmax = (r + 1) * blockSize if (rowmax > gray.shape[0]): rowmax = gray.shape[0] colmin = c * blockSize colmax = (c + 1) * blockSize if (colmax > gray.shape[1]): colmax = gray.shape[1] imageROI = gray[rowmin:rowmax, colmin:colmax] temaver = np.mean(imageROI) blockImage[r, c] = temaver blockImage = blockImage - average blockImage2 = cv2.resize(blockImage, (gray.shape[1], gray.shape[0]), interpolation=cv2.INTER_CUBIC) gray2 = gray.astype(np.float32) dst = gray2 - blockImage2 dst[dst>255]=255 dst[dst<0]=0 dst = dst.astype(np.uint8) dst = cv2.GaussianBlur(dst, (3, 3), 0) #dst = cv2.cvtColor(dst, cv2.COLOR_GRAY2BGR) return dst if __name__ == '__main__': file = 'www.png' blockSize = 8 img = cv2.imread(file) b,g,r = cv2.split(img) dstb = unevenLightCompensate(b, blockSize) dstg = unevenLightCompensate(g, blockSize) dstr = unevenLightCompensate(r, blockSize) dst = cv2.merge([dstb, dstg, dstr]) result = np.concatenate([img, dst], axis=1)cv2.imwrite('result.jpg', result)
实验效果
补充
OpenCV实现光照去除效果
方法一(RGB归一化)
int main(int argc, char *argv[]){//double temp = 255 / log(256);//cout << "doubledouble temp ="<< temp<<endl;Mat image = imread("D://vvoo//sun_face.jpg", 1);if (!image.data){cout << "image loading error" <<endl;return -1;}imshow("原图", image);Mat class="lazy" data-src(image.size(), CV_32FC3);for (int i = 0; i < image.rows; i++){for (int j = 0; j < image.cols; j++){class="lazy" data-src.at<Vec3f>(i, j)[0] = 255 * (float)image.at<Vec3b>(i, j)[0] / ((float)image.at<Vec3b>(i, j)[0] + (float)image.at<Vec3b>(i, j)[2] + (float)image.at<Vec3b>(i, j)[1]+0.01);class="lazy" data-src.at<Vec3f>(i, j)[1] = 255 * (float)image.at<Vec3b>(i, j)[1] / ((float)image.at<Vec3b>(i, j)[0] + (float)image.at<Vec3b>(i, j)[2] + (float)image.at<Vec3b>(i, j)[1]+0.01);class="lazy" data-src.at<Vec3f>(i, j)[2] = 255 * (float)image.at<Vec3b>(i, j)[2] / ((float)image.at<Vec3b>(i, j)[0] + (float)image.at<Vec3b>(i, j)[2] + (float)image.at<Vec3b>(i, j)[1]+0.01);}}normalize(class="lazy" data-src, class="lazy" data-src, 0, 255, CV_MINMAX); convertScaleAbs(class="lazy" data-src,class="lazy" data-src);imshow("rgb", class="lazy" data-src);imwrite("C://Users//TOPSUN//Desktop//123.jpg", class="lazy" data-src);waitKey(0);return 0;}
实现效果
方法二
void unevenLightCompensate(Mat &image, int blockSize){if (image.channels() == 3) cvtColor(image, image, 7);double average = mean(image)[0];int rows_new = ceil(double(image.rows) / double(blockSize));int cols_new = ceil(double(image.cols) / double(blockSize));Mat blockImage;blockImage = Mat::zeros(rows_new, cols_new, CV_32FC1);for (int i = 0; i < rows_new; i++){for (int j = 0; j < cols_new; j++){int rowmin = i*blockSize;int rowmax = (i + 1)*blockSize;if (rowmax > image.rows) rowmax = image.rows;int colmin = j*blockSize;int colmax = (j + 1)*blockSize;if (colmax > image.cols) colmax = image.cols;Mat imageROI = image(Range(rowmin, rowmax), Range(colmin, colmax));double temaver = mean(imageROI)[0];blockImage.at<float>(i, j) = temaver;}}blockImage = blockImage - average;Mat blockImage2;resize(blockImage, blockImage2, image.size(), (0, 0), (0, 0), INTER_CUBIC);Mat image2;image.convertTo(image2, CV_32FC1);Mat dst = image2 - blockImage2;dst.convertTo(image, CV_8UC1);}int main(int argc, char *argv[]){//double temp = 255 / log(256);//cout << "doubledouble temp ="<< temp<<endl;Mat image = imread("C://Users//TOPSUN//Desktop//2.jpg", 1);if (!image.data){cout << "image loading error" <<endl;return -1;}imshow("原图", image);unevenLightCompensate(image, 12);imshow("rgb", image);imwrite("C://Users//TOPSUN//Desktop//123.jpg", image);waitKey(0);return 0;}
实现效果
感谢你能够认真阅读完这篇文章,希望小编分享的“Python如何实现特定场景去除高光算法”这篇文章对大家有帮助,同时也希望大家多多支持编程网,关注编程网行业资讯频道,更多相关知识等着你来学习!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341