试验报告

一、试验原理:

图像点处理是图像处理系列的基础,主要用于让我们熟悉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. 【组织级项目管理】P2 MSP P3O

    组织级项目管理--有你,有我,有大家 在过去的2年,无论对于企业来讲,还是对于我们个人都有很多大脑的冲击,有几个词大家应该特别耳熟能详:转型,变革,敏捷,互联网+,组织的项目化管理等.就是这些让我们的 ...

  2. 【Win 10 应用开发】启动远程设备上的应用

    这个功能必须在“红石-1”(build 14393)以上的系统版中才能使用,运行在一台设备上的应用,可以通过URI来启动另一台设备上的应用.激活远程应用需要以下前提: 系统必须是build 14393 ...

  3. WPF做12306验证码点击效果

    一.效果 和12306是一样的,运行一张图上点击多个位置,横线以上和左边框还有有边框位置不允许点击,点击按钮输出坐标集合,也就是12306登陆的时候,需要向后台传递的参数. 二.实现思路 1.获取验证 ...

  4. Android GridView 通过seletor 设置状态和默认状态

    Android中可以通过selector控制GridView Item 的状态,而省去使用代码控制 GridView View Selector Xml文件 <?xml version=&quo ...

  5. 普通程序员如何转向AI方向

    眼下,人工智能已经成为越来越火的一个方向.普通程序员,如何转向人工智能方向,是知乎上的一个问题.本文是我对此问题的一个回答的归档版.相比原回答有所内容增加. 一. 目的 本文的目的是给出一个简单的,平 ...

  6. C++ 拷贝构造函数和赋值运算符

    本文主要介绍了拷贝构造函数和赋值运算符的区别,以及在什么时候调用拷贝构造函数.什么情况下调用赋值运算符.最后,简单的分析了下深拷贝和浅拷贝的问题. 拷贝构造函数和赋值运算符 在默认情况下(用户没有定义 ...

  7. 编写高质量代码:改善Java程序的151个建议(第7章:泛型和反射___建议106~109)

    建议106:动态代理可以使代理模式更加灵活 Java的反射框架提供了动态代理(Dynamic Proxy)机制,允许在运行期对目标类生成代理,避免重复开发.我们知道一个静态代理是通过主题角色(Prox ...

  8. Spring aop应用之实现数据库读写分离

    Spring加Mybatis实现MySQL数据库主从读写分离 ,实现的原理是配置了多套数据源,相应的sqlsessionfactory,transactionmanager和事务代理各配置了一套,如果 ...

  9. QT内省机制、自定义Model、数据库

    本文将介绍自定义Model过程中数据库数据源的获取方法,我使用过以下三种方式获取数据库数据源: 创建 存储对应数据库所有字段的 结构体,将结构体置于容器中返回,然后根据索引值(QModelIndex) ...

  10. javaScript之BOM操作1

    <!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...