在去雾算法中,受雾的影响,每个像素点的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];
}
效果图: