学习OpenCV:滤镜系列(11)——高反差保留 (6.30修改版)

【原文:http://blog.csdn.net/yangtrees/article/details/9157749

==============================================

版权所有:小熊不去实验室CSDN博客

==============================================


高反差保留就是高通滤波

r=(pix[x,y]-avg(R))/128

pix[x,y]*r+128*(1-r)

  1. #include <math.h>  
  2. #include <opencv/cv.h>  
  3. #include <opencv/highgui.h>  
  4.   
  5. using namespace cv;  
  6. using namespace std;  
  7.   
  8. int R=5;  
  9.   
  10. int main()  
  11. {  
  12.     Mat src = imread("D:/10.jpg",1);  
  13.     int width=src.cols;  
  14.     int heigh=src.rows;  
  15.     Mat img;  
  16.     src.copyTo(img);  
  17.     Mat avg;  
  18.     //GaussianBlur(img,avg,Size(R,R),0.0);  
  19.     blur(img,avg,Size(R,R));  
  20.     Mat dst(img.size(),CV_8UC3);  
  21.     float tmp;  
  22.     for (int y=0;y<heigh;y++)  
  23.     {  
  24.         uchar* imgP=img.ptr<uchar>(y);  
  25.         uchar* avgP=avg.ptr<uchar>(y);  
  26.         uchar* dstP=dst.ptr<uchar>(y);  
  27.         for (int x=0;x<width;x++)  
  28.         {  
  29.             float r0 = abs((float)imgP[3*x]-(float)avgP[3*x])/128;    
  30.             tmp = abs( ((float)imgP[3*x]  )*r0 + 128*(1-r0) );  
  31.             tmp=tmp>255?255:tmp;  
  32.             tmp=tmp<0?0:tmp;  
  33.             dstP[3*x]=(uchar)(tmp);  
  34.   
  35.             float r1 = abs((float)imgP[3*x+1]-(float)avgP[3*x+1])/128;  
  36.             tmp = (uchar)abs( ((float)imgP[3*x+1])*r1 + 128*(1-r1) );  
  37.             tmp=tmp>255?255:tmp;  
  38.             tmp=tmp<0?0:tmp;  
  39.             dstP[3*x+1]=(uchar)(tmp);  
  40.               
  41.             float r2 = abs((float)imgP[3*x+2]-(float)avgP[3*x+2])/128;  
  42.             tmp = (uchar)abs( ((float)imgP[3*x+2])*r2 + 128*(1-r2) );  
  43.             tmp=tmp>255?255:tmp;  
  44.             tmp=tmp<0?0:tmp;  
  45.             dstP[3*x+2]=(uchar)(tmp);  
  46.         }  
  47.     }  
  48.     imshow("high",dst);  
  49.       
  50.     //高通滤波测试  
  51.   
  52.     Mat kern = (Mat_<char>(3,3) <<  -1, -1,  -1,  
  53.                                     -1,  5, -1,  
  54.                                     -1, -1,  -1);  
  55.     Mat dstF;  
  56.     filter2D(img,dstF,img.depth(),kern);  
  57.     imshow("kernel",dstF);  
  58.   
  59.     waitKey();  
  60.     imwrite("D:/高反差保留.jpg",dst);  
  61.     imwrite("D:/高通滤波.jpg",dstF);  
  62. }  


原图:



高反差保留:



高通滤波器:




修改版 高反差保留 对比PS的效果,更加接近。

    r    = (pix[x,y]-avg(R))

dst[x,y] = 128+|r|*r/(2*R)


  1. #include <math.h>  
  2. #include <opencv/cv.h>  
  3. #include <opencv/highgui.h>  
  4.   
  5. using namespace cv;  
  6. using namespace std;  
  7.   
  8. int R=11;  
  9.   
  10. int main()  
  11. {  
  12.     Mat src = imread("D:/img/liushishi02.jpg",1);  
  13.     imshow("src",src);  
  14.     int width=src.cols;  
  15.     int heigh=src.rows;  
  16.     Mat img;  
  17.     src.copyTo(img);  
  18.     Mat avg;  
  19.     //GaussianBlur(img,avg,Size(R,R),0.0);  
  20.     blur(img,avg,Size(R,R));  
  21.     Mat dst(img.size(),CV_8UC3);  
  22.     float tmp;  
  23.     for (int y=0;y<heigh;y++)  
  24.     {  
  25.         uchar* imgP=img.ptr<uchar>(y);  
  26.         uchar* avgP=avg.ptr<uchar>(y);  
  27.         uchar* dstP=dst.ptr<uchar>(y);  
  28.         for (int x=0;x<width;x++)  
  29.         {  
  30.   
  31.             float r0 = ((float)imgP[3*x]-(float)avgP[3*x]);    
  32.             tmp = 128+abs(r0)*r0/(2*R);  
  33.             tmp=tmp>255?255:tmp;  
  34.             tmp=tmp<0?0:tmp;  
  35.             dstP[3*x]=(uchar)(tmp);  
  36.   
  37.             float r1 = ((float)imgP[3*x+1]-(float)avgP[3*x+1]);  
  38.             tmp = 128+abs(r1)*r1/(2*R);  
  39.             tmp=tmp>255?255:tmp;  
  40.             tmp=tmp<0?0:tmp;  
  41.             dstP[3*x+1]=(uchar)(tmp);  
  42.               
  43.             float r2 = ((float)imgP[3*x+2]-(float)avgP[3*x+2]);  
  44.             tmp = 128+abs(r2)*r2/(2*R);  
  45.             tmp=tmp>255?255:tmp;  
  46.             tmp=tmp<0?0:tmp;  
  47.             dstP[3*x+2]=(uchar)(tmp);  
  48.         }  
  49.     }  
  50.     imshow("high",dst);  
  51.       
  52.     //高通滤波测试  
  53.   
  54.     Mat kern = (Mat_<char>(3,3) <<  0, -1,  0,  
  55.                                     -1,  5, -1,  
  56.                                     0, -1,  0);  
  57.     Mat dstF;  
  58.     filter2D(img,dstF,img.depth(),kern);  
  59.     imshow("kernel",dstF);  
  60.   
  61.     waitKey();  
  62.     //imwrite("D:/高反差保留.jpg",dst);  
  63. //  imwrite("D:/高通滤波.jpg",dstF);  
  64. }  

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值