注:本系列来自于图像处理课程实验,用Matlab实现最主要的图像处理算法

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


1.灰度线性变换

(1)线性变换函数

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

(2)代码实现

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

  1. function [ new ] = LinearTransformFunc( original, k, d )
  2. new = original * k + d;
  3. end

当中k和d是线性函数的斜率和截距。由用户输入指定,用户输入为空时赋予默认值:

  • input函数获取用户输入
  • isempty推断用户输入是否为空:
  1. k = input('please input the slope(k) of grayscale linear transformation function:\n');
  2. b = input('please input the intercept(b) of grayscale linear transformation function:\n');
  3. if isempty(k)
  4. k = 1;
  5. end
  6. if isempty(b)
  7. b = 0;
  8. end

变换图像名也能够由用户input指定。默觉得lena图:

  • imread读出图片。返回值第一个是我们须要的灰度图(二维矩阵)
  • 对变换后的灰度图,用imshowfigure中显示图像
  1. name = input('please input the name of image:\n');
  2. if isempty(name)
  3. name = 'lena';
  4. end
  5. original = imread(strcat('../exp/', name, '.bmp'));
  6. transformed = LinearTransformFunc(original, k, b);
  7. figure
  8. imshow(transformed)

在这个实验的操作中说明怎样读入、显示,后面实验不在赘述

(3)执行结果

利用subplot作图,把原图和线性变换后的图像对照,线性变换函数是f(x)=2x+10:

左图是原图像,右图是线性变换后图像。


2.灰度拉伸变换

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

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

(2)代码实现

整个程序用户接口和流程和线性变换相同,仅仅是须要用户输入两个控制点,并传入下面的分段线性变换函数:

  1. function [ new ] = StretchFunc(original, x1, y1, x2, y2 )
  2. new = original;
  3. w = size(new, 1);
  4. h = size(new, 2);
  5. k1 = y1 / x1;
  6. dk1 = (y2 - y1) / (x2 - x1);
  7. dk2 = (255 - y2) / (255 - x2);
  8. for i = 1 : w
  9. for j = 1 : h
  10. x = new(i, j);
  11. if x < x1
  12. new(i, j) = k1 * x;
  13. elseif x < x2
  14. new(i, j) = dk1 * (x - x1) + y1;
  15. else
  16. new(i, j) = dk2 * (x - x2) + y2;
  17. end
  18. end
  19. end
  20. end

这里不可避免要使用到for循环。

(3)执行结果

相同对照原图。默认控制点选取(-100,20)和(100,180)


3.灰度直方图

(1)灰度直方图

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

(2)代码实现

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

  1. function [ result ] = GrayScaleStatistic( original, low, high )
  2. w = size(original, 1);
  3. h = size(original, 2);
  4. result = zeros(1, high - low + 1);
  5. for i = 1 : w
  6. for j = 1 : h
  7. g = original(i, j);
  8. if g >= low && g <= high
  9. g = g - low + 1;
  10. result(g) = result(g) + 1;
  11. end
  12. end
  13. end
  14. end

然后就使用Matlab条形图作图函数bar完毕灰度图作图:

  1. y = GrayScaleStatistic(original, low, high);
  2. x = low : 1 : high;
  3. bar(x, y)

对于题目要求的可输入灰度区间显示,我们要么不统计区间[low, high]以外的灰度值。要么直接所有统计但在作图时用xlim函数限制x轴取值范围:

  1. xlim([low, high])

(3)执行结果

对照Matlab标准直方图作图函数histogram,结果例如以下:

也能够通过input输入限定区间。这里是[20,150]区间的灰度直方图:

左右对照,效果一致。


4.直方图均衡化

(1)直方图均衡算法

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

直方图均衡化算法例如以下

  1. 归一化灰度频数直方图。得到频率直方图sk
  2. sk计算频率累计直方图tk
  3. tk做取整扩展:tk = int[(L - 1) * tk + 0.5]。将直方图灰度映射尽量满整个灰度取值空间L
  4. 确定变换映射关系k->tk
  5. 依据映射关系变换图像灰度值

(2)代码实现

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

Normalize函数例如以下:

  1. function [ new ] = Normalize( original, v )
  2. s = sum(v);
  3. tv = v / s;
  4. l = length(v);
  5. for i = 2 : l
  6. tv(i) = tv(i) + tv(i - 1);
  7. end
  8. tk = uint8(255 * tv + 0.5);
  9. w = size(original, 1);
  10. h = size(original, 2);
  11. new = original;
  12. for i = 1 : w
  13. for j = 1 : h
  14. new(i, j) = tk(original(i, j) + 1);
  15. end
  16. end
  17. end

说明:

  • tv先计算频率直方图,再通过累加得到累计直方图
  • tk依据累计直方图计算新的灰度映射关系
  • 最后遍历整个图像把原灰度转换成均衡化后的灰度值

当中有一下几点须要注意,也是Matlab图操作的注意点:

  • Matlab默认类型是double。对灰度值赋值时注意强制转换类型,保证类型一致
  • Matlab坐标起始从1開始。而灰度值是uint8的0-255。因此映射数组tk把原始灰度映射到变换后灰度时须要加1

(3)结果展示

pout.bmp是一副灰度分布较为集中的图像,因此图像对照度不高,显示较为模糊。使用直方图均值化,分散灰度分布从而增强对照度:

通过对照均衡先后直方图分布,能够发现:

  • 灰度分布不能全然平均化,是因为均值化算法中运用了取整运算,而不是离散值的全然均衡化
  • 得到的均衡化后直方图走势没有发生变化。因此图像没有失真

Matlab图像处理系列1———线性变换和直方图均衡的更多相关文章

  1. Matlab图像处理系列2———空间域平滑滤波器

    注:本系列来自于图像处理课程实验,用Matlab实现最主要的图像处理算法 本文章是Matlab图像处理系列的第二篇文章.介绍了空间域图像处理最主要的概念----模版和滤波器,给出了均值滤波起和中值滤波 ...

  2. Matlab图像处理系列4———图像傅立叶变换与反变换

    注:本系列来自于图像处理课程实验.用Matlab实现最主要的图像处理算法 1.Fourier变换 (1)频域增强 除了在空间域内能够加工处理图像以外.我们还能够将图像变换到其它空间后进行处理.这些方法 ...

  3. Matlab图像处理系列4———傅立叶变换和反变换的图像

    注意:这一系列实验的图像处理程序,使用Matlab实现最重要的图像处理算法 1.Fourier兑换 (1)频域增强 除了在空间域内能够加工处理图像以外,我们还能够将图像变换到其它空间后进行处理.这些方 ...

  4. matlab图像处理

    matlab图像处理 转自:http://www.cnblogs.com/lovebay/p/5094146.html 1. 图像和图像数据 缺省情况下,MATLAB将图像中的数据存储为双精度类型(d ...

  5. [转载]matlab图像处理为什么要归一化和如何归一化

    matlab图像处理为什么要归一化和如何归一化,一.为什么归一化1.   基本上归一化思想是利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响.也就是转换成唯一的标准形式以抵抗仿射变 ...

  6. Atitit MATLAB 图像处理 经典书籍attilax总结

    Atitit MATLAB 图像处理 经典书籍attilax总结 1.1. MATLAB数字图像处理1 1.2. <MATLAB实用教程(第二版)>((美)穆尔 著)[简介_书评_在线阅读 ...

  7. Atitit MATLAB 图像处理attilax总结

    Atitit MATLAB 图像处理attilax总结 1.1. 下载 Matlab7.0官方下载_Matlab2012 v7.0 官方简体中文版-办公软件-系统大全.html1 1.2. Matla ...

  8. Matlab图像处理函数:regionprops

    本篇文章为转载,仅为方便学术讨论所用,不用于商业用途.由于时间较久,原作者以及原始链接暂时无法找到,如有侵权以及其他任何事宜欢迎跟我联系,如有侵扰,在此提前表示歉意.----------------- ...

  9. MATLAB图像处理函数汇总(二)

    60.imnoise 功能:增加图像的渲染效果. 语法: J = imnoise(I,type) J = imnoise(I,type,parameters) 举例 I = imread('eight ...

随机推荐

  1. android使用自己定义属性AttributeSet

    这里为了演示使用自己定义变量,字体大小改用自己定义的属性. 首先要创建变量,创建了个values/attrs.xml文件,文件名称随意,可是要在values文件夹下: <?xml version ...

  2. Datagridview列绑定数据

    属性最下面的Column项: 把每一列的字段绑定,更改显示的标题. 数据绑定代码: string sql = "select IncomeExpendTypeID , TypeName , ...

  3. 模拟QQ系统设置面板实现功能

    业务需求: 基于网盘客户端的实现,原有网盘的设置面板无论从界面显示还是从业务需求都不能满足我们的正常需求.当前的要求是,模拟QQ系统设置的面板实现当前我们网盘中的基本配置功能.在完成这篇文章时已将基本 ...

  4. 基于visual Studio2013解决C语言竞赛题之0703乾坤大挪移

       题目

  5. 道格拉斯—普克(Douglas一Peukcer)节点抽稀算法

    Douglas一Peukcer算法由D.Douglas和T.Peueker于1973年提出,简称D一P算法,是眼下公认的线状要素化简经典算法.现有的线化简算法中,有相当一部分都是在该算法基础上进行改进 ...

  6. c语言,动态数组

    试着直接malloc一个2*3*4的空间来模拟数组: #include <stdio.h> #include <malloc.h> int main(void) { int** ...

  7. 12.5.3 UNIVERSAL:最终的祖先类:

    <pre name="code" class="html">12.5.3 UNIVERSAL:最终的祖先类: 你可以把 UNIVERSAL 看作最终 ...

  8. JAVA中extends 与implements有啥区别?

    JAVA中extends 与implements有啥区别?1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extend ...

  9. Python学习笔记 — 函数

    函数是对程序逻辑进行结构化或过程化的一种编程方法.函数具有两个方面的意义:1)将代码分块,易于管理和阅读:2)最大化代码复用和最小化代码冗余,节省空间,有助于保持一致性. 1. 函数定义 Python ...

  10. DOM API

    documentObject.documentElement 返回文档的根节点 document.documentElement; //返回<HTML><HTML>