试验报告

一、试验原理:

图像点处理是图像处理系列的基础,主要用于让我们熟悉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. 从源码看Azkaban作业流下发过程

    上一篇零散地罗列了看源码时记录的一些类的信息,这篇完整介绍一个作业流在Azkaban中的执行过程,希望可以帮助刚刚接手Azkaban相关工作的开发.测试. 一.Azkaban简介 Azkaban作为开 ...

  2. 在.NET Core 里使用 BouncyCastle 的DES加密算法

    .NET Core上面的DES等加密算法要等到1.2 才支持,我们可是急需这个算法的支持,文章<使用 JavaScriptService 在.NET Core 里实现DES加密算法>需要用 ...

  3. Android混合开发之WebView与Javascript交互

    前言: 最近公司的App为了加快开发效率选择了一部分功能采用H5开发,从目前市面的大部分App来讲,大致分成Native App.Web App.Hybrid App三种方式,个人觉得目前以Hybri ...

  4. MAC下 mysql不能插入中文和中文乱码的问题总结

    MAC下 mysql不能插入中文和中文乱码的问题总结 前言 本文中所提到的问题解决方案,都是基于mac环境下的,但其他环境,比如windows应该也适用. 问题描述 本文解决下边两个问题: 往mysq ...

  5. 写出易调试的SQL

    h4 { background: #698B22 !important; color: #FFFFFF; font-family: "微软雅黑", "宋体", ...

  6. 使用RequireJS并实现一个自己的模块加载器 (一)

    RequireJS & SeaJS 在 模块化开发 开发以前,都是直接在页面上引入 script 标签来引用脚本的,当项目变得比较复杂,就会带来很多问题. JS项目中的依赖只有通过引入JS的顺 ...

  7. 后缀数组的倍增算法(Prefix Doubling)

    后缀数组的倍增算法(Prefix Doubling) 文本内容除特殊注明外,均在知识共享署名-非商业性使用-相同方式共享 3.0协议下提供,附加条款亦可能应用. 最近在自学习BWT算法(Burrows ...

  8. bzoj1901--树状数组套主席树

    树状数组套主席树模板题... 题目大意: 给定一个含有n个数的序列a[1],a[2],a[3]--a[n],程序必须回答这样的询问:对于给定的i,j,k,在a[i],a[i+1],a[i+2]--a[ ...

  9. Mysql - 数据库操作

    之前介绍了数据库的增删改查, 发现忘记了数据库的一些基本操作, 比如建库, 建表, 改表等等. 那这里就来小结一下数据库sql形式的基本操作. 一.库操作 1. 建库 在建库之前, 可能需要看一下, ...

  10. zookeeper(单机/集群)安装与配置

    一.安装与单机配置 1.下载: wget http://archive.apache.org/dist/zookeeper/stable/zookeeper-3.4.6.tar.gz 如果网站下载不了 ...