数字图像处理中的伽马校正技术详解
创作时间:
作者:
@小白创作中心
数字图像处理中的伽马校正技术详解
引用
CSDN
1.
https://blog.csdn.net/2301_80417284/article/details/144426409
伽马校正是一种在图像处理中非常广泛使用的技术,用来调整图像的亮度和对比度,改善图像质量。其原理是基于人眼对亮度感知的非线性特性:人眼对亮度的敏感度随着亮度的增加而减少,也就是说,当亮度较低时,人眼对亮度变化更敏感。
伽马校正的原理
伽马校正公式:
其中,C和r都为常数,C为亮度和对比度缩放系数,通常取值为1,r为gamma值,I为归一化的值,范围是0~1,O为输出值。
由图可以看到:当r小于1时,会拉伸灰度较低的区域,同时会压缩灰度较高的部分,会使图像暗部更亮;当r大于1时,会拉伸灰度较高的区域,同时会压缩灰度交低的部分,会使图像亮度更亮。
- 如果一张照片暗部细节模糊不清,可以用 r<1 的曲线来处理,使暗部细节更清晰。
- 如果一张照片高光部分过于平淡,可以用 r>1 的曲线来处理,使高光部分层次更丰富。
MATLAB实现
% 读取图像
img = imread('D:\FPGA\Image_processing/13_gamma/matlab/1_1920x1080.bmp');
% 应用gamma校正
img_gamma1 = gamma_f1(img, 2.2); % gamma=2.2
img_gamma2 = gamma_f1(img, 1/2.2); % gamma=1/2.2
% 显示结果
figure('Name', 'Gamma Correction Results');
subplot(1,3,1);
imshow(img);
title('Original');
subplot(1,3,2);
imshow(img_gamma1);
title('Gamma = 2.2');
subplot(1,3,3);
imshow(img_gamma2);
title('Gamma = 1/2.2');
% 方法1: 幂函数
function gamma_corrected = gamma_f1(img, gamma)
if nargin < 2
gamma = 2.0;
end
% 将图像归一化到0-1范围,进行gamma校正,然后还原到0-255范围
gamma_corrected = uint8(255 * power(double(img) / 255, gamma));
end
% 方法2: 查表法
function gamma_corrected = gamma_f2(img, gamma)
if nargin < 2
gamma = 2.0;
end
% 创建查找表
table = uint8(power((0:255)/255, gamma) * 255);
% 使用查找表进行映射
gamma_corrected = intlut(img, table);
end
COE文件生成
% 清空工作区
clear all;
close all;
% 计算gamma=2.2的查找表
gamma_2_2 = uint8(power((0:255)/255, 2.2) * 255);
% 计算gamma=1/2.2的查找表
gamma_1_2_2 = uint8(power((0:255)/255, 1/2.2) * 255);
% 生成gamma=2.2的COE文件
fid = fopen('gamma_2_2.coe', 'w');
fprintf(fid, 'memory_initialization_radix=10;\n');
fprintf(fid, 'memory_initialization_vector=\n');
for i = 1:255
fprintf(fid, '%d,\n', gamma_2_2(i));
end
fprintf(fid, '%d;', gamma_2_2(256));
fclose(fid);
% 生成gamma=1/2.2的COE文件
fid = fopen('gamma_1_2_2.coe', 'w');
fprintf(fid, 'memory_initialization_radix=10;\n');
fprintf(fid, 'memory_initialization_vector=\n');
for i = 1:255
fprintf(fid, '%d,\n', gamma_1_2_2(i));
end
fprintf(fid, '%d;', gamma_1_2_2(256));
fclose(fid);
% 绘制查找表曲线进行对比
figure;
plot(0:255, gamma_2_2, 'b-', 'LineWidth', 2);
hold on;
plot(0:255, gamma_1_2_2, 'r-', 'LineWidth', 2);
plot(0:255, 0:255, 'k--', 'LineWidth', 1);
grid on;
title('Gamma Correction Curves');
xlabel('Input Pixel Value');
ylabel('Output Pixel Value');
legend('gamma = 2.2', 'gamma = 1/2.2', 'Linear');
FPGA实现
module image_gamma
(
input wire [7:0] red ,
input wire [7:0] green ,
input wire [7:0] blue ,
input wire clk ,
input wire mode , //1表示gamma2.2 0表示gamma1/2.2
output wire [7:0] red_adjust ,
output wire [7:0] green_adjust,
output wire [7:0] blue_adjust
);
wire [7:0] red_douta,red_doutb,green_douta,green_doutb,blue_douta,blue_doutb;
gamma_8x256 gamma_8x256_inst_red
(
.clka (clk ),
.addra (red ),
.douta (red_douta )
);
gamma_8x256_2 gamma_8x256_2_inst_red
(
.clka (clk ),
.addra (red ),
.douta (red_doutb )
);
gamma_8x256 gamma_8x256_inst_green
(
.clka (clk ),
.addra (green ),
.douta (green_douta)
);
gamma_8x256_2 gamma_8x256_2_inst_green
(
.clka (clk ),
.addra (green ),
.douta (green_doutb)
);
gamma_8x256 gamma_8x256_inst_blue
(
.clka (clk ),
.addra (blue ),
.douta (blue_douta )
);
gamma_8x256_2 gamma_8x256_2_inst_blue
(
.clka (clk ),
.addra (blue ),
.douta (blue_doutb )
);
assign red_adjust = mode ? red_douta : red_doutb;
assign green_adjust = mode ? green_douta: green_doutb;
assign blue_adjust = mode ? blue_douta : blue_doutb;
endmodule
实验现象
- 顶层模块输入mode = 1,实验现象如下:
- 顶层模块输入mode = 0,实验现象如下:
热门推荐
“兵道伐谋”的“道”有多厉害?
刚怀孕需要去医院检查吗
有限责任公司同股不同权的法律探讨与实践分析
泰山景区摩崖石刻“上新”!山东新发现文物点6473处
鱼放冰箱多久不能吃
市盈率估值的方法有哪些?这些方法的优缺点分别是什么?
率土之滨S2赛季卡包抽取攻略:平民玩家也能轻松获取绝版武将
详解中国出口许可证申请流程!
肥胖者该如何合理食用肉类以利身体健康
社区减负的长效机制研究
银行储蓄卡的消费限额如何调整?
团体体检报告自己可以拿吗?团体体检的重要性与实施
滋补养生的红枣银耳羹:甜品首选
无人机电池:高性能与长续航的奥秘
化妆遮瑕的正确步骤 教你完美遮瑕的技巧
什么是税收的强制性
家庭教育丨这18个好习惯,越早养成越好!
短短26个小时,梅西C罗引爆欧战,两人之间的实力差距有多大
C罗梅西西甲巅峰数个赛季数据对比!不服不行 梅西始终压C罗一头
疾病科普 | 造血干细胞移植供者的选择,需要遵循哪些原则 ?
广东宏远内线进阶!2米26高塔徐昕的训练之路
开学了,孩子们的膳食指南来了!
腹膜透析肾友必看:定期随访真的只是走个过场吗?
腹膜功能障碍的评估与管理
福建的“天涯海角”北茭村,长在悬崖上的美丽渔村,等你来体验
平潭旅游必去十大景点:从风车田到蓝眼泪,解锁海蚀奇观的浪漫密码
蓝牙无线耳机声音变小、音效变差怎么办?简单实用的解决方案
债权投资应纳税调整的探讨
债权投资税收处理:政策解读与操作指南
在英国如何拨打报警电话:紧急与非紧急情况全攻略