使用MATLAB对图像处理的几种方法(下)
试验报告
图像点处理是图像处理系列的基础,主要用于让我们熟悉Matlab图像处理的编程环境。灰度线性变换和灰度拉伸是对像素灰度值的变换操作,直方图是对像素灰度值的统计,直方图均衡是对灰度值分布的变换。
1.灰度线性变换
(1)线性变换函数
(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)代码实现
3.灰度直方图
(1)灰度直方图
灰度直方图就是对图像中每个像素点的灰度值出现的频数或频率(归一化)的统计,那么我们直接遍历整个图像统计出每个灰度值出现次数再做相应处理即可。
(2)代码实现
首先需要遍历统计灰度,我在GrayScaleStatistic函数里完成统计,区间[low, high]是目标灰度统计区间,默认是[0,255]:
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对图像处理的几种方法(下)的更多相关文章
- 使用MATLAB对图像处理的几种方法(上)
实验一图像的滤波处理 一.实验目的 使用MATLAB处理图像,掌握均值滤波器和加权均值滤波器的使用,对比两种滤波器对图像处理结果及系统自带函数和自定义函数性能的比较,体会不同大小的掩模对图像细节的影响 ...
- (转)C#进行图像处理的几种方法(Bitmap,BitmapData,IntPtr)
转自 http://blog.sina.com.cn/s/blog_628821950100wh9w.html C#进行图像处理的几种方法 本文讨论了C#图像处理中Bitmap类.BitmapData ...
- MATLAB中多行注释的三种方法
MATLAB中多行注释的三种方法 A. %{ 若干语句 %} B. 多行注释: 选中要注释的若干语句, 编辑器菜单Text->Comment, 或者快捷键Ctrl+R 取消注释: 选中要取消注释 ...
- C#数字图像处理的3种方法
本文主要通过彩色图象灰度化来介绍C#处理数字图像的3种方法,Bitmap类.BitmapData类和Graphics类是C#处理图像的的3个重要的类. Bitmap只要用于处理由像素数据定义的图像的对 ...
- 使用C#进行图像处理的几种方法(转)
本文讨论了C#图像处理中Bitmap类.BitmapData类和unsafe代码的使用以及字节对齐问题. Bitmap类 命名空间:System.Drawing 封装 GDI+ 位图,此位图由图形图像 ...
- 【数值分析】误差的分析与减少及Matlab解线性方程的四种方法
1.误差的来源 模型误差:数学模型与实际问题之间的误差 观测误差:测量数据与实际数据的误差 方法误差:数学模型的精确解与数值方法得到的数值解之间的误差:例如 舍入误差:对数据进行四舍五入后产生的误差 ...
- [转]使用C#进行图像处理的几种方法
最近做监控图像由彩色变灰处理的时候发现图像处理过程中,很慢很慢代码如下: int Height = this.picInfo.Image.Height; int ...
- {matlab}取二值图像centroid几种方法性能比较
试验很简单,取二值图像的质心,三种方法做比较 1.完全采用矩阵性能不做任何循环操作,对find后的值进行除法与取余操作,从而得到centroid 2.完全采用循环操作,最简单明了 3.结合1,2,对每 ...
- Matlab画平滑曲线的两种方法
自然状态下,用plot画的是折线,而不是平滑曲线. 有两种方法可以画平滑曲线,第一种是拟合的方法,第二种是用spcrv,其实原理应该都一样就是插值.下面是源程序,大家可以根据需要自行选择,更改拟合的参 ...
随机推荐
- 从源码看Azkaban作业流下发过程
上一篇零散地罗列了看源码时记录的一些类的信息,这篇完整介绍一个作业流在Azkaban中的执行过程,希望可以帮助刚刚接手Azkaban相关工作的开发.测试. 一.Azkaban简介 Azkaban作为开 ...
- Unity3d学习 预设体(prefab)的一些理解
之前一直在想如果要在Unity3d上创建很多个具有相同结构的对象,是如何做的,后来查了相关资料发现预设体可以解决这个问题! 预设体的概念: 组件的集合体 , 预制物体可以实例化成游戏对象. 创建预设体 ...
- java中的锁
java中有哪些锁 这个问题在我看了一遍<java并发编程>后尽然无法回答,说明自己对于锁的概念了解的不够.于是再次翻看了一下书里的内容,突然有点打开脑门的感觉.看来确实是要学习的最好方式 ...
- xamarin DependencyService源码阅读
xamarin在面对PCL无法实现的各平台特有功能时使用了一种叫[DependencyService]的方式来实现.它使得xamarin能像原生平台一样做平台能做到的事情!主要分四个部分 接口:定义功 ...
- Bootstrap 模态框(Modal)插件
页面效果: html+js: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> ...
- JavaScript之职责链模式
一.概述 职责链模式(Chain of responsibility),就是使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这个对象连成一条链,并沿着这条链传递该请求,直到有 ...
- Linux常用指令指南,终端装逼利器
最近搞了台Macbook Pro,就学习了一下Linux命令,在网上查了些资料,看了本书叫<快乐的 Linux 命令行>,里面涉及到了各个方面的命令. 在此将常用的整理出来,以备将来使用. ...
- [笔记]HAproxy reload config file with uninterrupt session
HAProxy is a high performance load balancer. It is very light-weight, and free, making it a great op ...
- arcgis api for js入门开发系列八聚合效果(含源代码)
上一篇实现了demo的图层控制模块,本篇新增聚合效果,截图如下(源代码见文章底部): 聚合效果实现的思路如下: 1.map.html引用聚合包,项目已经包含进来了的聚合文件夹: <script ...
- Kotlin中变量不同于Java: var 对val(KAD 02)
原文标题:Variables in Kotlin, differences with Java. var vs val (KAD 02) 作者:Antonio Leiva 时间:Nov 28, 201 ...