图像对比度增强(Contrast Enhancement)详解

Contrast Enhancement:
对比度增强一直是图像处理中的一个恒久话题,一般来说都是基于直方图的,比如直方图均衡化。冈萨雷斯的书里面对这个话题讲的比较透彻。
关于图像增强必须清楚的基本概念
1.图像增强的目的

1)改善图像的视觉效果,
2)转换为更适合于人或机器分析处理的形式
3)突出对人或机器分析有意义的信息
4)抑制无用信息,提高图像的使用价值
5)增强后的图像并不一定保真

2,图像增强的方法分类

1)从处理对象分类:灰度图像,(伪)彩色图像
2)从处理策略分类:全局处理,局部处理(ROI ROI,Region of Interest Interest)
3)从处理方法分类:空间域(点域运算,即灰度变换;邻域方法,即空域滤波),频域方法
4)从处理目的分类:图像锐化,平滑去噪,灰度调整(对比度增强)

3.图像增强的方法:
(1). 基于直方图均衡化的图像增强(Histogram Equalization)
a. 基本思想
对于图像中的灰度点做映射,使得整体图像的灰度大致符合均匀分布。增强图像的对比度。

  • 对于灰度值连续的情况,使用灰度的累积分布函数CDF做转换函数,可以使得输出图像的灰度符合均匀分布。
  • 对于灰度值不连续的情况,存在舍入误差,得到的灰度分布大致符合均匀分布。
  • 直观地理解,如果某一个灰度范围(如200-201)的像素点很少,那么它的概率密度值就会很小,所以CDF在200-201附近的增长变化就会很小;反之,如果某一个灰度范围(如100-101)的像素点很多,CDF在100-101附近的增长变化会很大。总体来看,以灰度为横轴,CDF为纵轴画曲线。这种向上凸的曲线,很像gamma变换: s=crγs=crγ中γ<1γ<1的情形。将灰度集中的部分拉伸,而将灰度不集中的部分压缩,达到提高对比度的效果。
  • 直方图均衡可以看做自适应的gamma变换或者分段变换。前者的优势在于,不需要指定任何参数,所有运算都是基于图像本身的。

b. 算法
step1:根据图像灰度计算灰度概率密度函数PDF
step2:计算累积概率分布函数CDF
step3:将CDF归一化到原图灰度取值范围,如[0,255]。
step4:之后CDF四舍五入取整,得到灰度转换函数sk=T(rk)
step5:将CDF作为转换函数,将灰度为rk的点转换为sk灰度

直方图均衡化是通过调整图像的灰阶分布,使得在0~255灰阶上的分布更加均衡,提高了图像的对比度,达到改善图像主观视觉效果的目的。对比度较低的图像适合使用直方图均衡化方法来增强图像细节。

彩色图像的直方图均衡化实现:

#include <opencv2/opencv.hpp>   
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char *argv[])
{
	Mat image = imread("D:/picture/opencv/images/Lenna.png", 1);
	if (image.empty())
	{
		cout << "could not load images.." << endl;
		return -1;
	}
	imshow("src", image);
	Mat imageRGB[3];
	split(image, imageRGB);
	for (int i = 0; i < 3; i++)
	{
		equalizeHist(imageRGB[i], imageRGB[i]);
	}
	merge(imageRGB, 3, image);
	imshow("equalizeHist", image);
	waitKey(0);
	return 0;
}

程序运行结果
(2). 基于拉普拉斯算子的图像增强

使用中心为5的8邻域拉普拉斯算子与图像卷积可以达到锐化增强图像的目的,拉普拉斯算子如下图所示:
拉普拉斯算子

#include<opencv2/opencv.hpp>
#include<iostream>

using namespace cv;
using namespace std;
int main(int argc, char *argv[])
{
	Mat image = imread("D:/picture/opencv/images/Lenna.png", 1);
	if (image.empty())
	{
		cout << "could not load images..." << endl;
		return -1;
	}
	imshow("原图像", image);
	Mat imageEnhance;
	Mat kernel = (Mat_<float>(3, 3) << 0, -1, 0, 0, 5, 0, 0, -1, 0);
	filter2D(image, imageEnhance, CV_8UC3, kernel);
	imshow("拉普拉斯算子图像增强效果", imageEnhance);
	waitKey(0);
	return 0;
}

拉普拉斯对比度增强

(3).基于对数Log变换的图像增强

对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到强调图像低灰度部分的目的。变换方法:
在这里插入图片描述
对数变换对图像低灰度部分细节增强的功能过可以从对数图上直观理解:

在这里插入图片描述
x轴的0.4大约对应了y轴的0.8,即原图上00.4的低灰度部分经过对数运算后扩展到00.8的部分,而整个0.41的高灰度部分被投影到只有0.81的区间,这样就达到了扩展和增强低灰度部分,压缩高灰度部分的值的功能。

从上图还可以看到,对于不同的底数,底数越大,对低灰度部分的扩展就越强,对高灰度部分的压缩也就越强。

#include <opencv2/opencv.hpp>
#include<iostream>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
	Mat image = imread("D:/picture/opencv/images/Lenna.png");
	Mat imageLog(image.size(), CV_32FC3);
	for (int i = 0; i < image.rows; i++)
	{
		for (int j = 0; j < image.cols; j++)
		{
			imageLog.at<Vec3f>(i, j)[0] = log(1 + image.at<Vec3b>(i, j)[0]);
			imageLog.at<Vec3f>(i, j)[1] = log(1 + image.at<Vec3b>(i, j)[1]);
			imageLog.at<Vec3f>(i, j)[2] = log(1 + image.at<Vec3b>(i, j)[2]);
		}
	}
	//归一化到0~255  
	normalize(imageLog, imageLog, 0, 255, CV_MINMAX);
	//转换成8bit图像显示  
	convertScaleAbs(imageLog, imageLog);
	imshow("src", image);
	imshow("基于对数Log变换的图像增强", imageLog);
	waitKey();
	return 0;
}

基于对数Log变换的图像增强
(4). 基于伽马(Gamma)变换的图像增强

伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。变换公式就是对原图像上每一个像素值做乘积运算:
在这里插入图片描述
伽马变换对图像的修正作用其实就是通过增强低灰度或高灰度的细节实现的,从伽马曲线可以直观理解:

在这里插入图片描述
γ值以1为分界,值越小,对图像低灰度部分的扩展作用就越强,值越大,对图像高灰度部分的扩展作用就越强,通过不同的γ值,就可以达到增强低灰度或高灰度部分细节的作用。

伽马变换对于图像对比度偏低,并且整体亮度值偏高(对于于相机过曝)情况下的图像增强效果明显

#include <opencv2/opencv.hpp>    
#include <iostream>

using namespace std;
using namespace cv;

int main(int argc, char *argv[])
{
	Mat image = imread("D:/picture/opencv/images/Lenna.png");
	Mat imageGamma(image.size(), CV_32FC3);
	for (int i = 0; i < image.rows; i++)
	{
		for (int j = 0; j < image.cols; j++)
		{
			imageGamma.at<Vec3f>(i, j)[0] = (image.at<Vec3b>(i, j)[0])*(image.at<Vec3b>(i, j)[0])*(image.at<Vec3b>(i, j)[0]);
			imageGamma.at<Vec3f>(i, j)[1] = (image.at<Vec3b>(i, j)[1])*(image.at<Vec3b>(i, j)[1])*(image.at<Vec3b>(i, j)[1]);
			imageGamma.at<Vec3f>(i, j)[2] = (image.at<Vec3b>(i, j)[2])*(image.at<Vec3b>(i, j)[2])*(image.at<Vec3b>(i, j)[2]);
		}
	}
	//归一化到0~255  
	normalize(imageGamma, imageGamma, 0, 255, CV_MINMAX);
	//转换成8bit图像显示  
	convertScaleAbs(imageGamma, imageGamma);
	imshow("原图", image);
	imshow("伽马变换图像增强效果", imageGamma);
	waitKey();
	return 0;
}

在这里插入图片描述

  • 21
    点赞
  • 241
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Halcon中提供了几个图像增强算子来增强图像对比度,包括线性和非线性算子。其中一个常用的线性算子是`scale_image`,该算子通过线性缩放图像的灰度级来增强图像对比度。具体实现如下: ```hocon scale_image(Image, ScaledImage, MinVal, MaxVal) ``` 其中,`Image`是输入图像,`ScaledImage`是输出图像,`MinVal`和`MaxVal`是输出图像的最小和最大灰度值。 例如,以下代码将图像的灰度级线性缩放到0到255之间: ```hocon scale_image(Image, ScaledImage, 0, 255) ``` 除了线性算子之外,Halcon还提供了一些非线性算子,例如`histogram_equalization`、`gamma_correction`和`local_equalization`等。这些算子可以根据具体应用场景选择使用。 ### 回答2: Halcon是一种图像处理软件,提供了丰富的图像增强功能,包括增强图像对比度的算子。 Halcon中常用的增强图像对比度算子有直方图均衡化和灰度拉伸。直方图均衡化是一种通过调整图像像素的分布来增强图像对比度的方法。它通过计算图像的直方图,并将像素的灰度级重新映射到更均匀的范围内,使得图像的亮度和对比度得到改善。 另一种常用的算子是灰度拉伸。灰度拉伸是根据图像的最大和最小像素值来重新映射图像的灰度级,从而增强图像对比度。通过灰度拉伸算子,可以使得图像的亮度范围更广,细节更加清晰,从而提升图像的视觉效果。 除了直方图均衡化和灰度拉伸,Halcon还提供了其他一些增强图像对比度的算子,如自适应增强和局部对比度增强。自适应增强是一种根据图像局部特征进行对比度增强的方法,它可以根据图像的局部结构和纹理进行增强,从而提高图像的细节和清晰度。局部对比度增强是一种通过增加图像中灰度级的动态范围来增强图像对比度的方法,它可以在保持图像细节的同时增强图像对比度。 总之,Halcon提供了多种增强图像对比度的算子,可以根据不同的需求选择合适的方法来提高图像对比度,从而改善图像的视觉效果。 ### 回答3: Halcon增强图像对比度算子是一种图像处理技术,用于改善图像的视觉效果和增强图像的细节。通过提高图像对比度,可以使图像的明暗区域更加清晰,从而提高图像的可读性和识别准确性。 Halcon增强图像对比度算子的工作原理主要包括两个步骤:亮度调整和对比度增强。 首先,通过亮度调整,算子可以增加或减小图像的整体亮度。这可以通过改变图像的亮度值来实现,例如通过调整亮度的曲线或使用灰度映射函数。 其次,对比度增强是通过增加图像的明暗差异来使图像的细节更加突出。这可以通过直方图均衡化来实现,直方图均衡化可以通过重新分配图像像素的灰度值来增加图像对比度,并使得图像中的不同灰度级别出现的频率更加均匀。 Halcon增强图像对比度算子的应用非常广泛。它可以应用于各种图像处理任务,如数字图像处理、机器视觉、医学图像分析等。通过增强图像对比度,可以更好地分析和识别图像中的目标对象,提高自动化和智能化系统的性能。 总之,Halcon增强图像对比度算子是一种有效的图像处理技术,可以通过亮度调整和对比度增强来改善图像的视觉效果和增强图像的细节。它在各种领域和应用中发挥着重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值