周围像素点的最大均方差替代该点

      在去雾算法中,受雾的影响,每个像素点的RGB值会趋于相等,基于这个事实,我计算每个点所在子块3*3的区域的,每个像素RGB值得均方差,用最大值替代该值,得到的效果图很差,代码如下,仅供自己学习反思:
void Ctry::OnTryTyr1()
{
	IplImage* img = cvLoadImage("C:\\Users\\Administrator\\Desktop\\pic1.jpg", -1);
	IplImage* pic = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
	CvScalar pixel;
	for (int i = 1; i < img->height-1; i++)
	{
		for (int j = 1; j < img->width-1; j++)
		{		
			pixel = lookfor(cvGet2D(img, i - 1, j - 1), cvGet2D(img, i - 1, j), cvGet2D(img, i - 1, j + 1), cvGet2D(img, i, j - 1), cvGet2D(img, i, j), cvGet2D(img, i, j + 1), cvGet2D(img, i + 1, j - 1), cvGet2D(img, i + 1, j), cvGet2D(img, i + 1, j + 1));
			cvSet2D(pic, i, j, pixel);
		}
	}
	CvScalar pixel1, pixel2;
    //设置左右竖直方向边缘的像素点
	for (int i = 0; i < img->height; i++)
	{
		pixel1 = cvGet2D(img, i, 0);
		pixel2 = cvGet2D(img, i, img->width-1);
		cvSet2D(pic, i, 0, pixel1);
		cvSet2D(pic, i, img->width-1, pixel2);
	}
	//设置上下水平方向边缘的像素点
	for (int i = 1; i < img->width - 1; i++)
	{
		pixel1 = cvGet2D(img, 0, i);
		pixel2 = cvGet2D(img, img->height-1, i);
		cvSet2D(pic, 0, i, pixel1);
		cvSet2D(pic, img->height-1, i, pixel2);
	}
	cvSaveImage("C:\\Users\\Administrator\\Desktop\\pic2.jpg", pic);
}

CvScalar Ctry::lookfor(CvScalar p1, CvScalar p2, CvScalar p3, CvScalar p4, CvScalar p5, CvScalar p6, CvScalar p7, CvScalar p8, CvScalar p9)
{
	vector<CvScalar > Pixel{ p1,p2,p3,p4,p5,p6,p7,p8,p9};
	int num = 0;  //记录第几个点的均方差值最大
	double temp =0;
	double mean=0;    //RGB像素均值
	double dst;
	vector<double>  Dst ;       //均方差
	Dst.clear();
	//将每个像素点的均方差压入容器Dst中
	for (auto  i : Pixel)
	{		
		mean = (i.val[0] + i.val[1] + i.val[2]) / 3;
		dst = (i.val[0] - mean)*(i.val[0] - mean) + (i.val[1] - mean)*(i.val[1] - mean) + (i.val[2] - mean)*(i.val[2] - mean);
		Dst.push_back(dst);
	}
	//提取最大值点和第几个像素的均方差值最大
	temp = Dst[0];
	for (int j = 0; j <9; j++)
	{
		if (Dst[j]>temp)
		{
			temp = Dst[j];
			num = j;
		}	
	}
	return Pixel[num];
}

效果图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值