去雾算法

算法:

       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);
}

得到目标图:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值