算法:
1,选取无雾天空中一点,得到像素值A1(196,227,255)(蓝天的颜色)。选取有雾天空中的一点,得到像素值A2(168,173,179),f2(x,y)=f1(x,y)*A1/A2; f1:有雾的图;f2初步处理得到的新图。
2,直方图均衡,得到新图f3.
3,判断:当f3(x,y)<70,均衡后很暗的地区,f4(x,y)=f3(x,y)*0.1+f1(x,y)*0.9;else
f4(x,y)=f3(x,y)*0.6+f1(x,y)*0.4; 目的:f3人工修改的痕迹太明显,如果原图有些区域偏暗,那么均衡后,暗区域整体变成黑色,这个要避免。其余的地区也是为了增加美感
4,高斯滤波,让整体更和谐。
原图:
代码如下:
(一)第一步:(每次加载注意图像名称,这里可能没有对应好,但是函数都是调试过的,没有问题)
void Ctry::OnTryPath()
{
// TODO: 在此添加命令处理程序代码
IplImage* img = cvLoadImage("C:\\Users\\Administrator\\Desktop\\tt.jpg", -1);
CvScalar pixel, pixel1;
IplImage* pic = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
for (int i = 0; i < img->height; i++)
{
for (int j = 0; j < img->width; j++)
{
pixel = cvGet2D(img, i, j);
pixel1.val[0] = pixel.val[0] * (196.0 / 168.0);
pixel1.val[1] = pixel.val[1] * (227.0 / 173.0);
pixel1.val[2] = pixel.val[2] * (255.0 / 179.0);
cvSet2D(pic, i, j, pixel1);
}
}
cvSaveImage("C:\\Users\\Administrator\\Desktop\\pic.jpg", pic);
}
得到新图:
直方图均衡后得到:
void Ctry::OnTryTyr()
{
IplImage* img = cvLoadImage("C:\\Users\\Administrator\\Desktop\\pic.jpg", -1);
IplImage* merge = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
IplImage* r = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
IplImage* g = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
IplImage* b = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
cvSplit(img, b, g, r, NULL);
stretch(r, r);//该函数见我的博客文章《图像增强之直方图均衡化》
stretch(g, g);
stretch(b, b);
cvMerge(b, g, r, 0, merge);
cvSaveImage("C:\\Users\\Administrator\\Desktop\\merge11.jpg", merge);
}
(内存太大,2,38M,传不上来,截屏的)
第三步判断,高斯滤波后:
void Ctry::OnTry()
{
IplImage* img = cvLoadImage("C:\\Users\\Administrator\\Desktop\\merge11.jpg", -1);
IplImage* img1 = cvLoadImage("C:\\Users\\Administrator\\Desktop\\try.jpg", -1);
IplImage* mer= cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
CvScalar pixel, pixel1, pixel2;
for (int i = 0; i < img->height; i++)
{
for (int j = 0; j < img->width; j++)
{
pixel = cvGet2D(img1, i, j);
pixel2 = cvGet2D(img, i, j);
if (pixel2.val[0] < 100) //太暗,说明是人或树
{
pixel1.val[0] = pixel.val[0] * 0.9 + pixel2.val[0] * 0.1;
pixel1.val[1] = pixel.val[1] * 0.9 + pixel2.val[1] * 0.1;
pixel1.val[2] = pixel.val[2] * 0.9 + pixel2.val[2] * 0.1;
cvSet2D(mer, i, j, pixel1);
}
else
{
pixel1.val[0] = pixel.val[0] * 0.4 + pixel2.val[0] * 0.6;
pixel1.val[1] = pixel.val[1] * 0.4 + pixel2.val[1] * 0.6;
pixel1.val[2] = pixel.val[2] * 0.4 + pixel2.val[2] * 0.6;
cvSet2D(mer, i, j, pixel1);
}
}
}
cvSmooth(mer, mer, CV_GAUSSIAN, 3, 0, 0, 0);
cvSaveImage("C:\\Users\\Administrator\\Desktop\\mer11.jpg", mer);
}
得到目标图: