學習OpenCV:濾鏡系列(11)——高反差保留 (6.30修改版)

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

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


發佈了176 篇原創文章 · 獲贊 62 · 訪問量 160萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章