Python如何实现特定场景去除高光算法(python,开发技术)

时间:2024-05-03 18:12:43 作者 : 石家庄SEO 分类 : 开发技术
  • TAG :

算法思路

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)

实验效果

Python如何实现特定场景去除高光算法

补充

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;}

实现效果

Python如何实现特定场景去除高光算法

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;}

实现效果

Python如何实现特定场景去除高光算法

 </div> <div class="zixun-tj-product adv-bottom"></div> </div> </div> <div class="prve-next-news">
本文:Python如何实现特定场景去除高光算法的详细内容,希望对您有所帮助,信息来源于网络。
上一篇:Python如何利用txt文件对Mysql进行增删改查移下一篇:

7 人围观 / 0 条评论 ↓快速评论↓

(必须)

(必须,保密)

阿狸1 阿狸2 阿狸3 阿狸4 阿狸5 阿狸6 阿狸7 阿狸8 阿狸9 阿狸10 阿狸11 阿狸12 阿狸13 阿狸14 阿狸15 阿狸16 阿狸17 阿狸18