Python如何实现特定场景去除高光算法
导读:本文共2863字符,通常情况下阅读需要10分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 算法思路1、求取源图I的平均灰度,并记录rows和cols;2、按照一定大小,分为N*M个方块,求出每块的平均值,得到子块的亮度矩阵D;3、用矩阵D的每个元素减去源图的平均灰度,得到子块的亮度差值矩阵E;4、通过插值算法,将矩阵E差值成与源图一样大小的亮度分布矩阵R;5、得到矫正后的图像result=I-R;应用场景光照不均匀的整体色泽一样的物体,比如工业零件,... ...
音频解说
目录
(为您整理了一些要点),点击可以直达。算法思路
1、求取源图I的平均灰度,并记录rows和cols;
2、按照一定大小,分为N*M个方块,求出每块的平均值,得到子块的亮度矩阵D;
3、用矩阵D的每个元素减去源图的平均灰度,得到子块的亮度差值矩阵E;
4、通过插值算法,将矩阵E差值成与源图一样大小的亮度分布矩阵R;
5、得到矫正后的图像result=I-R;
应用场景
光照不均匀的整体色泽一样的物体,比如工业零件,ocr场景。
代码实现
importcv2importnumpyasnpdefunevenLightCompensate(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)forrinrange(rows_new):forcinrange(cols_new):rowmin=r*blockSizerowmax=(r+1)*blockSizeif(rowmax>gray.shape[0]):rowmax=gray.shape[0]colmin=c*blockSizecolmax=(c+1)*blockSizeif(colmax>gray.shape[1]):colmax=gray.shape[1]imageROI=gray[rowmin:rowmax,colmin:colmax]temaver=np.mean(imageROI)blockImage[r,c]=temaverblockImage=blockImage-averageblockImage2=cv2.resize(blockImage,(gray.shape[1],gray.shape[0]),interpolation=cv2.INTER_CUBIC)gray2=gray.astype(np.float32)dst=gray2-blockImage2dst[dst>255]=255dst[dst<0]=0dst=dst.astype(np.uint8)dst=cv2.GaussianBlur(dst,(3,3),0)#dst=cv2.cvtColor(dst,cv2.COLOR_GRAY2BGR)returndstif__name__=='__main__':file='www.png'blockSize=8img=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实现光照去除效果
1.方法一(RGB归一化)
intmain(intargc,char*argv[]){ //doubletemp=255/log(256); //cout<<"doubledoubletemp="<<temp<<endl; Matimage=imread("D://vvoo//sun_face.jpg",1); if(!image.data) { cout<<"imageloadingerror"<<endl; return-1; } imshow("原图",image); Matsrc(image.size(),CV_32FC3); for(inti=0;i<image.rows;i++) { for(intj=0;j<image.cols;j++) { 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); 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); 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(src,src,0,255,CV_MINMAX); convertScaleAbs(src,src); imshow("rgb",src); imwrite("C://Users//TOPSUN//Desktop//123.jpg",src); waitKey(0); return0;}
实现效果
2.方法二
voidunevenLightCompensate(Mat&image,intblockSize){ if(image.channels()==3)cvtColor(image,image,7); doubleaverage=mean(image)[0]; introws_new=ceil(double(image.rows)/double(blockSize)); intcols_new=ceil(double(image.cols)/double(blockSize)); MatblockImage; blockImage=Mat::zeros(rows_new,cols_new,CV_32FC1); for(inti=0;i<rows_new;i++) { for(intj=0;j<cols_new;j++) { introwmin=i*blockSize; introwmax=(i+1)*blockSize; if(rowmax>image.rows)rowmax=image.rows; intcolmin=j*blockSize; intcolmax=(j+1)*blockSize; if(colmax>image.cols)colmax=image.cols; MatimageROI=image(Range(rowmin,rowmax),Range(colmin,colmax)); doubletemaver=mean(imageROI)[0]; blockImage.at<float>(i,j)=temaver; } } blockImage=blockImage-average; MatblockImage2; resize(blockImage,blockImage2,image.size(),(0,0),(0,0),INTER_CUBIC); Matimage2; image.convertTo(image2,CV_32FC1); Matdst=image2-blockImage2; dst.convertTo(image,CV_8UC1);}intmain(intargc,char*argv[]){ //doubletemp=255/log(256); //cout<<"doubledoubletemp="<<temp<<endl; Matimage=imread("C://Users//TOPSUN//Desktop//2.jpg",1); if(!image.data) { cout<<"imageloadingerror"<<endl; return-1; } imshow("原图",image); unevenLightCompensate(image,12); imshow("rgb",image); imwrite("C://Users//TOPSUN//Desktop//123.jpg",image); waitKey(0); return0;}
实现效果
</div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:
Python如何实现特定场景去除高光算法的详细内容,希望对您有所帮助,信息来源于网络。