学习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)
原图:
高反差保留:
高通滤波器:
修改版 高反差保留 对比PS的效果,更加接近。
r = (pix[x,y]-avg(R))
dst[x,y] = 128+|r|*r/(2*R)
版权所有:小熊不去实验室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); }
相关文章推荐
- 学习OpenCV:滤镜系列(11)——高反差保留 (6.30修改版)
- 高反差保留滤镜学习OpenCV:滤镜系列(11)——高反差保留
- 学习OpenCV:滤镜系列(6)——风
- 学习OpenCV:滤镜系列(5)——径向模糊:缩放&旋转
- 学习OpenCV:滤镜系列(6)——风
- Opencv2系列学习笔记11(霍尔夫变换)
- 学习OpenCV:滤镜系列(14)——载入选区
- 学习OpenCV:滤镜系列(7)——漩涡
- 学习OpenCV:滤镜系列(10)——怀旧色 & 连环画 & 熔铸 & 冰冻
- 学习OpenCV:滤镜系列(8)——素描
- 学习OpenCV:滤镜系列(3)——颜色变幻
- 学习OpenCV:滤镜系列(8)——素描
- 学习OpenCV:滤镜系列(12)——计算模式(强光)
- 学习OpenCV:滤镜系列(3)——颜色变幻
- 机器学习实践系列之11 - OpenCV实战车道线检测
- 学习OpenCV:滤镜系列(13)——计算模式算法集合
- 学习OpenCV:滤镜系列(14)——载入选区
- 学习OpenCV:滤镜系列(1)—— 雕刻&浮雕
- 学习OpenCV:滤镜系列(2)——扩张&挤压
- 学习OpenCV:滤镜系列(15)——羽化(模糊边缘)