博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
使用MATLAB对图像处理的几种方法(下)
阅读量:5056 次
发布时间:2019-06-12

本文共 3542 字,大约阅读时间需要 11 分钟。

 试验报告

一、试验原理:

图像点处理是图像处理系列的基础,主要用于让我们熟悉Matlab图像处理的编程环境。灰度线性变换和灰度拉伸是对像素灰度值的变换操作,直方图是对像素灰度值的统计,直方图均衡是对灰度值分布的变换。

1.灰度线性变换

(1)线性变换函数

原图向灰度值为g
,通过线性函数f(x)=kx+b
转换为f(g)
得到灰度的线性变换。

(2)代码实现

Matlab中支持矩阵作为函数参数传入,定义一个线性转换函数,利用Matlab矩阵操作,用一行代码即可对整个二维图像矩阵中所有点的灰度进行线。

函数文件:LinearTransformFunc.m

%原图向灰度值为g,通过线性函数f(x)=kx+b转换为f(g)得到灰度的线性变换.

%把图像中每个像素点的灰度值,按照希望达到的效果,以线性变化的形式,进行变换

%LinearTransformFunc函数名(灰度线性变换)

function [ new ] = LinearTransformFunc(original,k,d)

%利用线性公式:y=k*x+b;

%其中k和d是线性函数的斜率和截 

  new=original*k+d;

 

end

2.灰度拉伸变换

(1)灰度拉伸变换和线性分段函数

灰度拉伸变换和线性变换相似,只是是将灰度值做分段线性变换。分段函数控制点(x1,y1)(x2,y2)

(2)代码实现

函数文件:
StretchFunc.m
%灰度拉伸变换和线性变换相似,只是是将灰度值做分段线性变换.
%StretchFunc函数名(灰度拉伸变换)
function [ new ] = StretchFunc(original, x1, y1, x2, y2 )
    new = original;
%分段函数控制点(x1,y1)和(x2,y2)   
%size将图像转换为几维的数组
    w = size(new, 1);
    h = size(new, 2);
%k1,dk1,dk2为斜率
    k1 = y1 / x1;
    dk1 = (y2 - y1) / (x2 - x1);
    dk2 = (255 - y2) / (255 - x2);
    
%for循环 for end成对出现
%new(IDE_Obj,'name','type') creates a project, library, or buildconfiguration in the IDE.
%如果两个参数,表示project
    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
 

3.灰度直方图

(1)灰度直方图

灰度直方图就是对图像中每个像素点的灰度值出现的频数或频率(归一化)的统计,那么我们直接遍历整个图像统计出每个灰度值出现次数再做相应处理即可。

(2)代码实现

首先需要遍历统计灰度,我在GrayScaleStatistic函数里完成统计,区间[low, high]是目标灰度统计区间,默认是[0,255]:

函数文件:
GrayScaleStatistic.m
%灰度直方图就是对图像中每个像素点的灰度值出现的频数或频率(归一化)的统计.
%查看每一个像素点是属于哪一个灰度级的,即,统计出这一副图像各个灰度级出现的次数,灰度级出现频率=灰度级出现次数/总像素点的个数,
%这样0~255个灰度级都应该有各自的一个出现频率,把出现频率,以柱状图的形式表现出来,就是直方图
%GrayScaleStatistic函数名(灰度直方图)
function [ result ] = GrayScaleStatistic( original, low, high )
%original为一个矩阵
    w = size(original, 1);
    h = size(original, 2);
%zeros(M,N)表示an M-by-N matrix of zeros
%区间[low, high]是目标灰度统计区间,默认是[0,255]
    result = zeros(1, high - low + 1);
%for循环
    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
 

4.直方图均衡化

(1)直方图均衡算法

直方图均衡主要用于增强动态范围偏小的图像的反差,其基本思想是把原始图像的直方图变换为均匀分布,从而增强灰度值的动态范围,以达到增强对比度的效果。

直方图均衡化算法如下

1. 归一化灰度频数直方图,得到频率直方图sk

2. sk计算频率累计直方图tk

3. tk做取整扩展:tk = int[(L - 1) * sk + 0.5],将直方图灰度映射尽量满整个灰度取值空间L

4. 确定变换映射关系k->tk

5. 根据映射关系变换图像灰度值

(2)代码实现

在脚本中调用Normalize函数直接得到均衡化后的图像,再统计直方图并显示。

函数文件:Normalize.m

%直方图均衡化:直方图均衡主要用于增强动态范围偏小的图像的反差,其基本思想是把原始图像的直方图变换为均匀分布,

%从而增强灰度值的动态范围,以达到增强对比度的效果。

%问题转换为:寻找一个变化函数,使变换后的图像灰度的概率密度函数等于1,即期望输出图像中每一灰度级有相同的概率。

%Pr(Rk)=Nk/N (Pr表示出现频率,Nk表示k(0,1,2,3……)级别出现次数,N为总个数)

%累积直方图:Sk=T(Rk)=\Sigma(Pr(Rj))\Sigma(nj/n) k=0,1,2,……L-1

%直方图均衡的过程:

%(1)统计原始图像的归一化直方图;

%(2)用累计分布函数做变换函数进行图像灰度变换;

%(3)建立输入图像与输出图像灰度级之间的对应关系,将变换后灰度级恢复成原先的灰度级范围。

%Normalize函数名(直方图均衡化)

function [ new ] = Normalize( original )

%size获取原始图像高和宽

%width=size(original,1);  height=size(original,2);

[height,width]=size(original);

 

%nk表示灰度级为k出现的次数

%灰度级范围0~255

nk=zeros(1,256);

for i=1:height

    for j=1:width

        nk(original(i,j)+1)=nk(original(i,j)+1)+1;

    end

end

%pk表示灰度级为k出现的概率pk=nk/n(n为像素点总个数)

pk=nk./(height*width);     %直立方图函数

%频率直方图sk

sk=zeros(1,256);

sk(1)=pk(1);

for i=2:255

    sk(i)=sk(i-1)+pk(i);

end

%kt是根据频率计算出累积直方图

%kt = int[(L - 1) * sk + 0.5],将直方图灰度映射尽量满整个灰度取值空间L

%kt=zeros(1,256);

%kt=uint8(floor(255.*sk+0.5));

kt=uint8(255.*sk);

%new为均衡化后图像

new=zeros(size(original));

for i=1:height

    for j=1:width

        new(i,j)=kt(original(i,j)+1);

    end

end   

 

二、试验心得:

通过试验,对图像处理有了进一步深入了解和认知,基于第一次的滤波的处理和这次灰度线性变换和直方图处理图像,知道了图像的成像原理,都是一个个的像素点,就是矩阵的值。以后可以利用MATLAB进行图像处理,运用数学知识,结合计算机知识运用在实际工作中。通过这两次作业的学习,收获很大的,之前一直觉得对于程序开发中只要会写代码就行,没有想到很多地方都是要用到数学知识,只是自己没有考虑到罢了。

转载于:https://www.cnblogs.com/dannyhaospace/p/6219381.html

你可能感兴趣的文章
关于 小程序 ios 转时间戳的兼容性 问题
查看>>
python拼接参数不确定的SQL时防注入问题--条件语句最后拼入
查看>>
全文检索引擎Sphinx之初体验
查看>>
JQuery EasyUI combobox动态添加option
查看>>
PHP如何关闭notice级别的错误提示
查看>>
for,forEach,for in ,for of,$.each和$().each应用
查看>>
随机生成四则运算2
查看>>
Googl地图找房总结
查看>>
从一台SQL SERVER 2008连接另外一台SQL SERVER报错。消息 18456,级别 14,状态 1,第 1 行...
查看>>
CentOS 7最小化安装后找不到‘ifconfig’命令——修复小提示(转)
查看>>
[Python + Unit Testing] Write Your First Python Unit Test with pytest
查看>>
[Docker] Install Docker on Windows (hp) and start with Kitematic
查看>>
Linq步步为营系列/WCF/SilverLight等
查看>>
Python基础学习
查看>>
【Maven】聚合
查看>>
【consul】使用学习
查看>>
第三方平台开发基本总结
查看>>
git push时报“The project you were looking for could not be found.”
查看>>
C#绘制渐变线条
查看>>
LA 4094 WonderTeam 构造
查看>>