图像处理 01反转变换+对数变换+幂律变换

目录

1、定义      

2、三种基本函数

2.1 反转变换(Image Negatives)

代码:

  实现效果:

2.2 对数变换(Log Transformations)

代码:

实现效果:

2.3 幂律变换(Power-Law Transformations)

代码:

实现效果:


1、定义      

        图像增强就是指通过某种图像处理方法对退化的某些图像特征,如边缘、轮廓、对比度等进行处理,以改善图像的视觉效果,提高图像的清晰度,或是突出图像中的某些“有用”,压缩其他“无用”信息,将图像转换为更适合人或计算机分析处理的形式。

        图像增强可以分为两类:空间域法和频域法

       空间域可以简单地理解为包含图像像素的空间,空间域法是指空间域中,也就是图像本身,直接对图像进行各种线性或非线性运算,对图像的像素灰度值做增强处理。

        频域法则是在图像的变换域中把图像看成一种二维信号,对其进行基于二维傅里叶变换的信号增强。对其进行基于二维傅里叶变换的信号增强。

2、三种基本函数

2.1 反转变换(Image Negatives)

        反转变换就是负片特效所使用的图像变换,其变换公式为: s = L - 1 - r ,其中 r是原始像素值,s是变换后的像素值,L-1表示图像像素的最大灰度,如8bit图像L为256。

        反转变换特别适合增强嵌入在一幅图像暗区域中的白色或灰色细节,特别是在黑色在图像范围占主导地位时。

代码:
void CBmp::invertImage(unsigned char* img_data, int bmpWidth, int bmpHeight, int lineByte)
{
	for (int i = 0; i < bmpHeight; i++) {
		for (int k = 0; k < bmpWidth; k++) {
			img_data[3 * k + 0] = 255 - img_data[3 * k + 0];  // 反转蓝色通道
			img_data[3 * k + 1] = 255 - img_data[3 * k + 1];  // 反转绿色通道
			img_data[3 * k + 2] = 255 - img_data[3 * k + 2];  // 反转红色通道
		}
		img_data += lineByte;
	}
}
  实现效果:

2.2 对数变换(Log Transformations

        对数变换公式为:s=clog(1+r)

        r是原始像素值,s是变换后的像素值,c是常数,这个常数的选择是为了确保对数变换后的像素值能够被映射到 [0, 255] 的范围内,保证对比度增强的效果。

        图像的对数变换主要的作用是压缩动态范围,原因是对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升,所以就可以增强图像的暗部细节。

        对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到图像偏暗的图像增强的目的,其逆变换可以强调高灰度。底数越大,对低灰度部分的强调就越强,对高灰度部分的压缩也就越强。相反的,如果想强调高灰度部分,则用反对数函数就可以了。

代码:
//对数变换
void CBmp::logTransform(unsigned char* img_data, int bmpWidth, int bmpHeight, int lineByte)
{
	const double c = 255.0 / log(1.0 + 255.0);  // 常数

	for (int i = 0; i < bmpHeight; i++) {
		for (int k = 0; k < bmpWidth; k++) {
			double pixelValue = img_data[3 * k + 0];  // 取蓝色通道作为像素值(你可以选择其他通道)

			// 对数变换公式
			pixelValue = c * log(1.0 + pixelValue);

			// 将变换后的值限制在 [0, 255] 范围内
			pixelValue = max(0.0, min(255.0, pixelValue));

			img_data[3 * k + 0] = static_cast<unsigned char>(pixelValue);
			img_data[3 * k + 1] = static_cast<unsigned char>(pixelValue);
			img_data[3 * k + 2] = static_cast<unsigned char>(pixelValue);
		}
		img_data += lineByte;
	}
}
实现效果:

2.3 幂律变换(Power-Law Transformations

        幂律变换的基本形式为:
在这里插入图片描述
        其中c和γ为常数,习惯上幂律变换的指数称为伽玛(gamma),因此幂律变换又称为伽玛变换。幂律变换,可以使得较窄范围的暗色像素输入值映射为较广范围的输出值,而对高灰度值则会收窄其输出值范围。γ值大于1时则效果与此相反。而当c和γ都等于1时,幂律变换就是恒等变换(identity transformation)。

        图像获取、 打印和显示等设备的输入、 输出响应通常为非线性的, 满足幂律关系。 为了得到正确的输出结果而对这种幂律关系进行校正的过程称之为伽玛校正。

       伽马变换主要用于图像的校正,将漂白的图片或者是过黑的图片,进行修正。 在低灰度值时,幂律变换使得目标图像灰度值变得更小,因此会使得暗的图像更暗,亮的更亮。

代码:
//幂律变换
void CBmp::powerLawTransform(unsigned char* img_data, int bmpWidth, int bmpHeight, int lineByte, double gamma)
{
	const double c = 255.0 / pow(255.0, gamma);  // 常数

	for (int i = 0; i < bmpHeight; i++) {
		for (int k = 0; k < bmpWidth; k++) {
			double pixelValue = img_data[3 * k + 0];  // 取蓝色通道作为像素值(你可以选择其他通道)

			// Power-Law Transformations 公式
			pixelValue = c * pow(pixelValue, gamma);

			// 将变换后的值限制在 [0, 255] 范围内
			pixelValue = max(0.0, min(255.0, pixelValue));

			img_data[3 * k + 0] = static_cast<unsigned char>(pixelValue);
			img_data[3 * k + 1] = static_cast<unsigned char>(pixelValue);
			img_data[3 * k + 2] = static_cast<unsigned char>(pixelValue);
		}
		img_data += lineByte;
	}
}
实现效果:


参考博文链接:https://blog.csdn.net/qq_40732350/article/details/114368326

https://blog.csdn.net/LaoYuanPython/article/details/117605784

数字图像处理中对数变换与Gamma变换_伽马变换适用于具有什么特点的图像_&星火的博客-CSDN博客

数字图像处理-python基于opencv代码实现 反转变换、对数变换和幂律(伽马)变换_cv2 伽马变换-CSDN博客

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是 MATLAB 中进行图像反转对数变换、幂函数变换、分段线性变换的代码: 1. 图像反转 ``` % 读取图像 img = imread('lena.jpg'); % 反转图像 img_reverse = 255 - img; % 显示原图和反转后的图像 subplot(1,2,1), imshow(img); title('Original Image') subplot(1,2,2), imshow(img_reverse); title('Reversed Image') ``` 2. 对数变换 ``` % 读取图像 img = imread('lena.jpg'); % 对数变换 c = 255/log(1+max(max(img))); img_log = c*log(1+double(img)); % 转回 uint8 类型 img_log = uint8(img_log); % 显示原图和对数变换后的图像 subplot(1,2,1), imshow(img); title('Original Image') subplot(1,2,2), imshow(img_log); title('Logarithmic Transformation') ``` 3. 幂函数变换 ``` % 读取图像 img = imread('lena.jpg'); % 幂函数变换 gamma = 0.5; img_power = 255*(double(img)/255).^gamma; % 转回 uint8 类型 img_power = uint8(img_power); % 显示原图和幂函数变换后的图像 subplot(1,2,1), imshow(img); title('Original Image') subplot(1,2,2), imshow(img_power); title('Power-Law Transformation') ``` 4. 分段线性变换 ``` % 读取图像 img = imread('lena.jpg'); % 分段线性变换 img_piecewise = zeros(size(img)); img_piecewise(img<=100) = img(img<=100)*0.5; img_piecewise(img>100 & img<=200) = (img(img>100 & img<=200)-100)*0.7+50; img_piecewise(img>200) = (img(img>200)-200)*0.4+125; % 转回 uint8 类型 img_piecewise = uint8(img_piecewise); % 显示原图和分段线性变换后的图像 subplot(1,2,1), imshow(img); title('Original Image') subplot(1,2,2), imshow(img_piecewise); title('Piecewise Linear Transformation') ``` 注意:以上代码仅为示例,实际应用时可能需要根据具体情况进行调整。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Flying778

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值