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

来源:互联网 发布:苹果mac电脑使用教程 编辑:程序博客网 时间:2024/05/11 03:19

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

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

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


高反差保留就是高通滤波

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

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

#include <math.h>#include <opencv/cv.h>#include <opencv/highgui.h>using namespace cv;using namespace std;int R=5;int main(){Mat src = imread("D:/10.jpg",1);int width=src.cols;int heigh=src.rows;Mat img;src.copyTo(img);Mat avg;//GaussianBlur(img,avg,Size(R,R),0.0);blur(img,avg,Size(R,R));Mat dst(img.size(),CV_8UC3);float tmp;for (int y=0;y<heigh;y++){uchar* imgP=img.ptr<uchar>(y);uchar* avgP=avg.ptr<uchar>(y);uchar* dstP=dst.ptr<uchar>(y);for (int x=0;x<width;x++){float r0 = abs((float)imgP[3*x]-(float)avgP[3*x])/128;  tmp = abs( ((float)imgP[3*x]  )*r0 + 128*(1-r0) );tmp=tmp>255?255:tmp;tmp=tmp<0?0:tmp;dstP[3*x]=(uchar)(tmp);float r1 = abs((float)imgP[3*x+1]-(float)avgP[3*x+1])/128;tmp = (uchar)abs( ((float)imgP[3*x+1])*r1 + 128*(1-r1) );tmp=tmp>255?255:tmp;tmp=tmp<0?0:tmp;dstP[3*x+1]=(uchar)(tmp);float r2 = abs((float)imgP[3*x+2]-(float)avgP[3*x+2])/128;tmp = (uchar)abs( ((float)imgP[3*x+2])*r2 + 128*(1-r2) );tmp=tmp>255?255:tmp;tmp=tmp<0?0:tmp;dstP[3*x+2]=(uchar)(tmp);}}imshow("high",dst);//高通滤波测试Mat kern = (Mat_<char>(3,3) <<  -1, -1,  -1,     -1,  5, -1,-1, -1,  -1);Mat dstF;filter2D(img,dstF,img.depth(),kern);imshow("kernel",dstF);waitKey();imwrite("D:/高反差保留.jpg",dst);imwrite("D:/高通滤波.jpg",dstF);}


原图:



高反差保留:



高通滤波器:




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

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

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


#include <math.h>#include <opencv/cv.h>#include <opencv/highgui.h>using namespace cv;using namespace std;int R=11;int main(){Mat src = imread("D:/img/liushishi02.jpg",1);imshow("src",src);int width=src.cols;int heigh=src.rows;Mat img;src.copyTo(img);Mat avg;//GaussianBlur(img,avg,Size(R,R),0.0);blur(img,avg,Size(R,R));Mat dst(img.size(),CV_8UC3);float tmp;for (int y=0;y<heigh;y++){uchar* imgP=img.ptr<uchar>(y);uchar* avgP=avg.ptr<uchar>(y);uchar* dstP=dst.ptr<uchar>(y);for (int x=0;x<width;x++){float r0 = ((float)imgP[3*x]-(float)avgP[3*x]);  tmp = 128+abs(r0)*r0/(2*R);tmp=tmp>255?255:tmp;tmp=tmp<0?0:tmp;dstP[3*x]=(uchar)(tmp);float r1 = ((float)imgP[3*x+1]-(float)avgP[3*x+1]);tmp = 128+abs(r1)*r1/(2*R);tmp=tmp>255?255:tmp;tmp=tmp<0?0:tmp;dstP[3*x+1]=(uchar)(tmp);float r2 = ((float)imgP[3*x+2]-(float)avgP[3*x+2]);tmp = 128+abs(r2)*r2/(2*R);tmp=tmp>255?255:tmp;tmp=tmp<0?0:tmp;dstP[3*x+2]=(uchar)(tmp);}}imshow("high",dst);//高通滤波测试Mat kern = (Mat_<char>(3,3) <<  0, -1,  0,     -1,  5, -1,0, -1,  0);Mat dstF;filter2D(img,dstF,img.depth(),kern);imshow("kernel",dstF);waitKey();//imwrite("D:/高反差保留.jpg",dst);//imwrite("D:/高通滤波.jpg",dstF);}


原创粉丝点击