试验报告

一、试验原理:

图像点处理是图像处理系列的基础,主要用于让我们熟悉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进行图像处理,运用数学知识,结合计算机知识运用在实际工作中。通过这两次作业的学习,收获很大的,之前一直觉得对于程序开发中只要会写代码就行,没有想到很多地方都是要用到数学知识,只是自己没有考虑到罢了。

使用MATLAB对图像处理的几种方法(下)的更多相关文章

  1. 使用MATLAB对图像处理的几种方法(上)

    实验一图像的滤波处理 一.实验目的 使用MATLAB处理图像,掌握均值滤波器和加权均值滤波器的使用,对比两种滤波器对图像处理结果及系统自带函数和自定义函数性能的比较,体会不同大小的掩模对图像细节的影响 ...

  2. (转)C#进行图像处理的几种方法(Bitmap,BitmapData,IntPtr)

    转自 http://blog.sina.com.cn/s/blog_628821950100wh9w.html C#进行图像处理的几种方法 本文讨论了C#图像处理中Bitmap类.BitmapData ...

  3. MATLAB中多行注释的三种方法

    MATLAB中多行注释的三种方法 A. %{ 若干语句 %} B. 多行注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...

  4. C#数字图像处理的3种方法

    本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类.BitmapData类和Graphics类是C#处理图像的的3个重要的类. Bitmap只要用于处理由像素数据定义的图像的对 ...

  5. 使用C#进行图像处理的几种方法(转)

    本文讨论了C#图像处理中Bitmap类.BitmapData类和unsafe代码的使用以及字节对齐问题. Bitmap类 命名空间:System.Drawing 封装 GDI+ 位图,此位图由图形图像 ...

  6. 【数值分析】误差的分析与减少及Matlab解线性方程的四种方法

    1.误差的来源 模型误差:数学模型与实际问题之间的误差 观测误差:测量数据与实际数据的误差 方法误差:数学模型的精确解与数值方法得到的数值解之间的误差:例如 舍入误差:对数据进行四舍五入后产生的误差 ...

  7. [转]使用C#进行图像处理的几种方法

    最近做监控图像由彩色变灰处理的时候发现图像处理过程中,很慢很慢代码如下: int Height = this.picInfo.Image.Height;                    int ...

  8. {matlab}取二值图像centroid几种方法性能比较

    试验很简单,取二值图像的质心,三种方法做比较 1.完全采用矩阵性能不做任何循环操作,对find后的值进行除法与取余操作,从而得到centroid 2.完全采用循环操作,最简单明了 3.结合1,2,对每 ...

  9. Matlab画平滑曲线的两种方法

    自然状态下,用plot画的是折线,而不是平滑曲线. 有两种方法可以画平滑曲线,第一种是拟合的方法,第二种是用spcrv,其实原理应该都一样就是插值.下面是源程序,大家可以根据需要自行选择,更改拟合的参 ...

随机推荐

  1. jquery.uploadify文件上传组件

    1.jquery.uploadify简介 在ASP.NET中上传的控件有很多,比如.NET自带的FileUpload,以及SWFUpload,Uploadify等等,尤其后面两个控件的用户体验比较好, ...

  2. MIP 官方发布 v1稳定版本

    近期,MIP官方发布了MIP系列文件的全新v1版本,我们建议大家尽快完成升级. 一. 我是开发者,如何升级版本? 对于MIP页面开发者来说,只需替换线上引用的MIP文件为v1版本,就可以完成升级.所有 ...

  3. Cassandra简介

    在前面的一篇文章<图形数据库Neo4J简介>中,我们介绍了一种非常流行的图形数据库Neo4J的使用方法.而在本文中,我们将对另外一种类型的NoSQL数据库——Cassandra进行简单地介 ...

  4. 为你的Web程序加个启动画面

    .Net开发者一定熟悉下面这个画面: 这就是宇宙第一IDE Visual Studio的启动画面,学名叫Splash Screen(或者Splash Window).同样,Javar们一定对Eclip ...

  5. ASP.NET内置对象的总结

    1. Response对象可形象的称之为响应对象,用于将数据从服务器发送回浏览器. 实例源码:链接: http://pan.baidu.com/s/1dDCKQ8x 密码: ihq0  2. Requ ...

  6. 浅谈 LayoutInflater

    浅谈 LayoutInflater 版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/View 文中如有纰漏,欢迎大家留言指出. 在 Android 的 ...

  7. 《你不知道的JavaScript》整理(四)——原型

    一.[[Prototype]] JavaScript中的对象有一个特殊的[[Prototype]]内置属性,其实就是对于其他对象的引用. var myObject = { a: 2 }; myObje ...

  8. css居中div的几种常用方法

    在开发过程中,很多需求需要我们居中一个div,比如html文档流当中的一块div,比如弹出层内容部分这种脱离了文档流等.不同的情况有不同的居中方式,接下来就分享下一下几种常用的居中方式. 1.text ...

  9. ZKWeb网页框架1.4正式发布

    本次更新的内容有 添加更快的批量操作函数 添加IDatabaseContext.FastBatchSave 添加IDatabaseContext.FastBatchDelete 注意这些函数不会触发注 ...

  10. 重新认识了下Entity Framework

    什么是Entity Framework Entity Framework是一个对象关系映射O/RM框架. Entity Framework让开发者可以像操作领域对象(domain-specific o ...