【OpenCV】常用的图像增强算法(备忘)

主要包含直方图均衡化,拉普拉斯算子卷积,log,gamma增强算法 

    //1.直方图均衡化增强
	Mat dstImg;
	Mat imgRGB[3];
	split(srcImg, imgRGB);
	for (int i = 0; i < 3; i++)
	{
		equalizeHist(imgRGB[i], imgRGB[i]);
	}
	merge(imgRGB, 3, dstImg);
	namedWindow("直方图均衡化增强图", 0);
	resizeWindow("直方图均衡化增强图", srcImg.cols / 3, srcImg.rows / 3);
	imshow("直方图均衡化增强图", dstImg);

	//2基于拉普拉斯算子的图像增强。
	Mat dstImg2;
	Mat kernel = (Mat_(3, 3) << 0, -1, 0, 0, 4, 0, 0, -1, 0);//定义3*3的卷积核
	filter2D(srcImg, dstImg2, CV_8UC3, kernel);
	namedWindow("拉普拉斯增强图", 0);
	resizeWindow("拉普拉斯增强图", srcImg.cols / 3, srcImg.rows / 3);
	imshow("拉普拉斯增强图", dstImg2);

	//基于log变换的图像增强(对于不同的底数,底数越大,对低灰度部分的扩展就越强,
	                        //对高灰度部分的压缩也就越强。)
	Mat dstImg3(srcImg.size(), CV_32FC3);
	for (int i = 0; i < srcImg.rows; i++)
	{
		for (int j = 0; j < srcImg.cols; j++)
		{
			dstImg3.at(i, j)[0] = log(1 + srcImg.at(i, j)[0]) / log(2);//已2为底
			dstImg3.at(i, j)[1] = log(1 + srcImg.at(i, j)[1]) / log(2);
			dstImg3.at(i, j)[2] = log(1 + srcImg.at(i, j)[2]) / log(2);
		}
	}
	//归一化到0~255  
	normalize(dstImg3, dstImg3, 0, 255, CV_MINMAX);
	//转换成8bit图像显示  
	convertScaleAbs(dstImg3, dstImg3);
	namedWindow("Log算子增强图", 0);
	resizeWindow("Log算子增强图", srcImg.cols / 3, srcImg.rows / 3);
	imshow("Log算子增强图", dstImg3);

	//伽马变换增强。γ值以1为分界,值越小,对图像低灰度部分的扩展作用就越强,
	//值越大,对图像高灰度部分的扩展作用就越强
	Mat imageGamma(srcImg.size(), CV_32FC3);
	for (int i = 0; i < srcImg.rows; i++)
	{
		for (int j = 0; j < srcImg.cols; j++)
		{
			imageGamma.at(i, j)[0] = pow(srcImg.at(i, j)[0], 5);
			imageGamma.at(i, j)[1] = pow(srcImg.at(i, j)[1], 5);
			imageGamma.at(i, j)[2] = pow(srcImg.at(i, j)[2], 5);
		}
	}
	//归一化到0~255  
	normalize(imageGamma, imageGamma, 0, 255, CV_MINMAX);
	//转换成8bit图像显示  
	convertScaleAbs(imageGamma, imageGamma);
	namedWindow("Gamma算子增强图", 0);
	resizeWindow("Gamma算子增强图", srcImg.cols / 3, srcImg.rows / 3);
	imshow("Gamma算子增强图", dstImg3);

 

你可能感兴趣的:(OpenCV)