==============================================
版權所有:小熊不去實驗室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);
}