图像处理 灰度的线性变换
Posted lipeng08
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像处理 灰度的线性变换相关的知识,希望对你有一定的参考价值。
灰度的线性变换
Db = f(Da) = k*Da +b k为斜率,b为y轴交点截距,Da为输入图像的灰度,Db为输出图像的灰度
三个有趣的结论,相信会对灰度变换的理解更加深刻:
1,k> 1增加对比度,k<1减小对比度
2,k=1改变亮度
3,k=1,b=0保持原来图像,k=-1,b=255,原图像反转
以下讲述线性变换的代码的步骤:
1,判断参数是否是8位图像
2,对像素的所有点执行线性变换
3,对执行完像素变换的灰度值进行合法性分析,对不合法的数据强制合法
4,对图片的原来坐标的所有点设置新的灰度值。
以下代码转载自数字图像与机器视觉一书:
所有的代码我都亲自测试了,感觉不是很难,后面的可能会越来越难,先一点点啃吧。BOOL CImgProcess::LinTranLP(CImgProcess* pTo, double dFa, double dFb)
if(m_pBMIH->biBitCount != 8) return false;
BYTE bGray,target;
for(int i = 0; i < m_pBMIH->biHeight; ++i)
for(int j = 0; j < m_pBMIH->biWidth; ++j)
bGray = GetGray(j,i);
target = dFa * bGray + dFb;
if(target < 0)
target = 0;
if(target > 255)
target = 255;
pTo->SetPixel(j, i, target);
return TRUE;
下面是采用的matlab的代码:
I = imread('coins.png'); % 读入原图像
I = im2double(I); % 转换数据类型为double
[M,N] = size(I); % 计算图像面积
figure(1); % 打开新窗口
imshow(I); % 显示原图像
title('原图像');
figure(2); % 打开新窗口
[H,x] = imhist(I, 64); % 计算64个小区间的灰度直方图
stem(x, (H/M/N), '.'); % 显示原图像的直方图
title('原图像');
% 增加对比度
Fa = 2; Fb = -55;
O = Fa * I + Fb/255;
figure(3);
subplot(2,2,1);
imshow(O);
title('Fa = 2 Fb = -55 增加对比度');
figure(4);
subplot(2,2,1);
[H,x] = imhist(O, 64);
stem(x, (H/M/N), '.');
title('Fa = 2 Fb = -55 增加对比度');
% 减小对比度
Fa = 0.5; Fb = -55;
O = Fa * I + Fb/255;
figure(3);
subplot(2,2,2);
imshow(O);
title('Fa = 0.5 Fb = -55 减小对比度');
figure(4);
subplot(2,2,2);
[H,x] = imhist(O, 64);
stem(x, (H/M/N), '.');
title('Fa = 0.5 Fb = -55 减小对比度');
% 线性增加亮度
Fa = 1; Fb = 55;
O = Fa * I + Fb/255;
figure(3);
subplot(2,2,3);
imshow(O);
title('Fa = 1 Fb = 55 线性平移增加亮度');
figure(4);
subplot(2,2,3);
[H,x] = imhist(O, 64);
stem(x, (H/M/N), '.');
title('Fa = 1 Fb = 55 线性平移增加亮度');
% 反相显示
Fa = -1; Fb = 255;
O = Fa * I + Fb/255;
figure(3);
subplot(2,2,4);
imshow(O);
title('Fa = -1 Fb = 255 反相显示');
figure(4);
subplot(2,2,4);
[H,x] = imhist(O, 64);
stem(x, (H/M/N), '.');
title('Fa = -1 Fb = 255 反相显示');
以上是关于图像处理 灰度的线性变换的主要内容,如果未能解决你的问题,请参考以下文章