matlab图像增强分段线性函数_Matlab图像处理系列1———线
性变换和直⽅图均衡...
注:本系列来⾃于图像处理课程实验,⽤Matlab实现最主要的图像处理算法
图像点处理是图像处理系列的基础,主要⽤于让我们熟悉Matlab图像处理的编程环境。灰度线性变换和灰度拉伸是对像素灰度值的变换操作,直⽅图是对像素灰度值的统计,直⽅图均衡是对灰度值分布的变换。
1.灰度线性变换
(1)线性变换函数
原图向灰度值为g。通过线性函数f(x)=kx+b转换为f(g)得到灰度的线性变换。
(2)代码实现
Matlab中⽀持矩阵作为函数參数传⼊。定义⼀个线性转换函数,利⽤Matlab矩阵操作,⽤⼀⾏代码就可以对整个⼆维图像矩阵中所有点的灰度进⾏线性变换:
function [ new ] = LinearTransformFunc( original, k, d )
new = original * k + d;
end
当中k和d是线性函数的斜率和截距。由⽤户输⼊指定,⽤户输⼊为空时赋予默认值:
input函数获取⽤户输⼊
isempty推断⽤户输⼊是否为空:
k = input('please input the slope(k) of grayscale linear transformation function:\n');
b = input('please input the intercept(b) of grayscale linear transformation function:\n');
if isempty(k)
k = 1;
end
if isempty(b)
b = 0;
end
变换图像名也能够由⽤户input指定。默觉得lena图:
imread读出图⽚。返回值第⼀个是我们须要的灰度图(⼆维矩阵)
对变换后的灰度图,⽤imshow在figure中显⽰图像
name = input('please input the name of image:\n');
if isempty(name)
name = 'lena';
end
original = imread(strcat('../exp/', name, '.bmp'));
transformed = LinearTransformFunc(original, k, b);
figure
imshow(transformed)
在这个实验的操作中说明怎样读⼊、显⽰,后⾯实验不在赘述
(3)执⾏结果
利⽤subplot作图,把原图和线性变换后的图像对照,线性变换函数是f(x)=2x+10:
左图是原图像,右图是线性变换后图像。
2.灰度拉伸变换
(1)灰度拉伸变换和线性分段函数
灰度拉伸变换和线性变换类似,仅仅是是将灰度值做分段线性变换。分段函数控制点(x1,y1)和(x2,y2):
(2)代码实现
整个程序⽤户接⼝和流程和线性变换相同,仅仅是须要⽤户输⼊两个控制点,并传⼊下⾯的分段线性变换函数:function [ new ] = StretchFunc(original, x1, y1, x2, y2 )
new = original;
w = size(new, 1);
h = size(new, 2);
k1 = y1 / x1;
dk1 = (y2 - y1) / (x2 - x1);
dk2 = (255 - y2) / (255 - x2);
for i = 1 : w
for j = 1 : h
x = new(i, j);
if x < x1
new(i, j) = k1 * x;
elseif x < x2
new(i, j) = dk1 * (x - x1) + y1;
else
new(i, j) = dk2 * (x - x2) + y2;
end
end
end
end
这⾥不可避免要使⽤到for循环。
(3)执⾏结果
相同对照原图。默认控制点选取(-100,20)和(100,180)
3.灰度直⽅图
(1)灰度直⽅图
灰度直⽅图就是对图像中每⼀个像素点的灰度值出现的频数或频率(归⼀化)的统计,那么我们直接遍历整个图像统计出每⼀个灰度值出现次数再做对应处理就可以。
(2)代码实现
⾸先须要遍历统计灰度,我在GrayScaleStatistic函数⾥完毕统计,区间[low, high]是⽬标灰度统计区间,默认是[0,255]:
function [ result ] = GrayScaleStatistic( original, low, high )
w = size(original, 1);
h = size(original, 2);
result = zeros(1, high - low + 1);
for i = 1 : w
for j = 1 : h
g = original(i, j);
if g >= low && g <= high
g = g - low + 1;
result(g) = result(g) + 1;
end
end
end
end
然后就使⽤Matlab条形图作图函数bar完毕灰度图作图:
y = GrayScaleStatistic(original, low, high);
x = low : 1 : high;
bar(x, y)
对于题⽬要求的可输⼊灰度区间显⽰,我们要么不统计区间[low, high]以外的灰度值。要么直接所有统计但在作图时⽤xlim函数限制x轴取值范围:
xlim([low, high])
(3)执⾏结果
对照Matlab标准直⽅图作图函数histogram,结果例如以下:
也能够通过input输⼊限定区间。这⾥是[20,150]区间的灰度直⽅图:
左右对照,效果⼀致。
4.直⽅图均衡化
(1)直⽅图均衡算法
直⽅图均衡主要⽤于增强动态范围偏⼩的图像的反差,其基本思想是把原始图像的直⽅图变换为均匀分布,从⽽增强灰度值的动态范围,以达到增强对照度的效果。
直⽅图均衡化算法例如以下
归⼀化灰度频数直⽅图。得到频率直⽅图sk
⽤sk计算频率累计直⽅图tk。
tk做取整扩展:tk = int[(L - 1) * tk + 0.5]。将直⽅图灰度映射尽量满整个灰度取值空间L
确定变换映射关系k->tk
依据映射关系变换图像灰度值
(2)代码实现
在脚本中调⽤Normalize函数直接得到均衡化后的图像。再统计直⽅图并显⽰。
Normalize函数例如以下:
function [ new ] = Normalize( original, v )
s = sum(v);
tv = v / s;
l = length(v);
for i = 2 : l
tv(i) = tv(i) + tv(i - 1);
matlab直方图end
tk = uint8(255 * tv + 0.5);
w = size(original, 1);
h = size(original, 2);
new = original;
for i = 1 : w
for j = 1 : h
new(i, j) = tk(original(i, j) + 1);
end
end
end
说明:
tv先计算频率直⽅图,再通过累加得到累计直⽅图
tk依据累计直⽅图计算新的灰度映射关系
最后遍历整个图像把原灰度转换成均衡化后的灰度值
当中有⼀下⼏点须要注意,也是Matlab图操作的注意点:
Matlab默认类型是double。对灰度值赋值时注意强制转换类型,保证类型⼀致
Matlab坐标起始从1開始。⽽灰度值是uint8的0-255。因此映射数组tk把原始灰度映射到变换后灰度时须要加1
(3)结果展⽰
pout.bmp是⼀副灰度分布较为集中的图像,因此图像对照度不⾼,显⽰较为模糊。使⽤直⽅图均值化,分散灰度分布从⽽增强对照度:通过对照均衡先后直⽅图分布,能够发现:
灰度分布不能全然平均化,是因为均值化算法中运⽤了取整运算,⽽不是离散值的全然均衡化
得到的均衡化后直⽅图⾛势没有发⽣变化。因此图像没有失真
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论