您的位置:首页 > 运维架构

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

2013-06-23 23:20 393 查看
==============================================

版权所有:小熊不去实验室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);
}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: