Matlab图像处理系列1———线性变换和直方图均衡

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

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


1.灰度线性变换

(1)线性变换函数

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

(2)代码实现

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

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

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

  • input函数获取用户输入
  • isempty判断用户输入是否为空:
k = input(‘please input the slope(k) of grayscale linear transformation function:\n‘);

b = input(‘please input the intercept(b) of grayscale linear transformation function:\n‘);

if isempty(k)
    k = 1;
end

if isempty(b)
    b = 0;
end

变换图像名也可以由用户input指定,默认为lena图:

  • imread读出图片,返回值第一个是我们需要的灰度图(二维矩阵)
  • 对变换后的灰度图,用imshowfigure中显示图像
name = input(‘please input the name of image:\n‘);

if isempty(name)
    name = ‘lena‘;
end

original = imread(strcat(‘../exp/‘, name, ‘.bmp‘));

transformed = LinearTransformFunc(original, k, b);

figure
imshow(transformed)

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

(3)运行结果

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

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


2.灰度拉伸变换

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

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

(2)代码实现

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

function [ new ] = StretchFunc(original, x1, y1, x2, y2 )
    new = original;

    w = size(new, 1);
    h = size(new, 2);

    k1 = y1 / x1;

    dk1 = (y2 - y1) / (x2 - x1);
    dk2 = (255 - y2) / (255 - x2);

    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

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

(3)运行结果

同样对比原图,默认控制点选取(-100,20)和(100,180)


3.灰度直方图

(1)灰度直方图

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

(2)代码实现

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

function [ result ] = GrayScaleStatistic( original, low, high )

    w = size(original, 1);
    h = size(original, 2);
    result = zeros(1, high - low + 1);

    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

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

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

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

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函数如下:

function [ new ] = Normalize( original, v )

    s = sum(v);
    tv = v / s;

    l = length(v);

    for i = 2 : l
        tv(i) = tv(i) + tv(i - 1);
    end

    tk = uint8(255 * tv + 0.5);

    w = size(original, 1);
    h = size(original, 2);

    new = original;

    for i = 1 : w
        for j = 1 : h
            new(i, j) = tk(original(i, j) + 1);
        end
    end

end

说明:

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

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

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

(3)结果展示

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

通过对比均衡先后直方图分布,可以发现:

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

时间: 2024-10-27 12:07:40

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

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

注:本系列来自于图像处理课程实验,用Matlab实现最基本的图像处理算法 本文章是Matlab图像处理系列的第二篇文章,介绍了空间域图像处理最基本的概念----模版和滤波器,给出了均值滤波起和中值滤波器的Matlab实现,最后简要讨论去躁效果. 1.空间域增强 (1)模版运算 图像处理中,模版可以看作是n*n(n一般是奇数)的窗口,模版连续地运动于整个图像中,对模版窗口范围内的像素做相应处理. 模版运算主要分为: 模版卷积 模版排序 模版卷积是把模版内像素的灰度值和模版中对应的灰度值相乘,求平均

Matlab图像处理系列3———空间域锐化滤波器

注:本系列来自于图像处理课程实验,用Matlab实现最基本的图像处理算法 1.锐化滤波器 锐化滤波,是将图像的低频部分减弱或去除,保留图像的高频部分,即图像的边缘信息. 图像的边缘.轮廓一般位于灰度突变的地方,也就是图像的高频部分,通常用灰度差分提取边缘轮廓. 图像中边缘轮廓通常是任意方向的,因此我们的差分运算需要具有方向性.各向同性的边缘检测算子对任意方向的边缘轮廓都有相同的检测能力,那么什么是算子? 算子是一个函数空间到函数空间上的映射O:X→X.广义上的算子可以推广到任何空间,如内积空间等

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

注:本系列来自于图像处理课程实验,用Matlab实现最基本的图像处理算法 1.Fourier变换 (1)频域增强 除了在空间域内可以加工处理图像以外,我们还可以将图像变换到其他空间后进行处理,这些方法称为变换域方法,最常见的变换域是频域. 使用Fourier变换把图像从空间域变换到频域,在频域内做相应增强处理,再从频域变换到空间域得到处理后的图像. 我们这里主要学习Fourier变换和FFT变换的算法,没有学过通信原理,我对信号.时域分析也不是很清楚. 2.FFT算法 (1)离散Fourier变

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

matlab图像处理为什么要归一化和如何归一化,一.为什么归一化1.   基本上归一化思想是利用图像的不变矩寻找一组参数使其能够消除其他变换函数对图像变换的影响.也就是转换成唯一的标准形式以抵抗仿射变换 图像归一化使得图像可以抵抗几何变换的攻击,它能够找出图像中的那些不变量,从而得知这些图像原本就是一样的或者一个系列的. 因为我们这次的图片有好多都是一个系列的,所以老师把这个也作为我研究的一个方向. 我们主要要通过归一化减小医学图片由于光线不均匀造成的干扰.2.matlab里图像数据有时候必须是

matlab图像处理

matlab图像处理 转自:http://www.cnblogs.com/lovebay/p/5094146.html 1. 图像和图像数据 缺省情况下,MATLAB将图像中的数据存储为双精度类型(double),64位浮点数,所需存储量很大:MATLAB还支持另一种类型无符号整型(uint8),即图像矩阵中每个数据占用1个字节. 在使用MATLAB工具箱时,一定要注意函数所要求的参数类型.另外,uint8与double两种类型数据的值域不同,编程需注意值域转换. 从uint8到double的转

学习笔记(2)---Matlab 图像处理相关函数命令大全

Matlab 图像处理相关函数命令大全 一.通用函数: colorbar  显示彩色条 语法:colorbar \ colorbar('vert') \ colorbar('horiz') \ colorbar(h) \ h=colorbar(...) \ colorbar(...,'peer',axes_handle) getimage 从坐标轴取得图像数据 语法:A=getimage(h) \ [x,y,A]=getimage(h) \ [...,A,flag]=getimage(h) \

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

1.1. MATLAB数字图像处理1 1.2. <MATLAB实用教程(第二版)>((美)穆尔 著)[简介_书评_在线阅读] - 当当图书.html1 1.3. 数字图像处理(MATLAB版)(第二版)(本科教学版)2 1.1. MATLAB数字图像处理 第1章 图像处理与MATLAB2007a简介 第2章 图像的编码和解码 第3章 图像复原 第4章 图像处理的相关操作 第5章 图像频域变换 第6章 图像处理中的代数运算及几何变换 第7章 图像增强 第8章 图像分割与边缘检测 第9章 小波分析

用C#调用Matlab图像处理自制QQ游戏2D桌球瞄准器

平时不怎么玩游戏,有时消遣就玩玩QQ里的2D桌球,但是玩的次数少,不能像骨灰级玩家一样百发百中,肿么办呢?于是某天突发奇想,决定自己也来做个“外挂”.说是外挂,其实只是一个瞄准器,毕竟外挂是修改别人的软件,有点违法的意思,况且自己还没有能力去那么做,所以自己还是弄个瞄准器,做做弊,过下小瘾,同时也提高一下自己的编程能力. 起初(也就是半年前),自己尝试做一个瞄准器的初始版本,用C#做,想法很简单: Step1.把鼠标移到洞口,获取鼠标位置: Step2.将鼠标放到要击打的球的圆心上,获取鼠标当前

MATLAB图像处理基础

MATLAB图像处理基础 2.2.1 图像文件格式及图像类型 1.MATLAB支持的几种图像文件格式: ⑴JPEG(Joint Photogyaphic Expeyts Group):一种称为联合图像专家组的图像压缩格式. ⑵BMP(Windows Bitmap):有1位.4位.8位.24位非压缩图像,8位RLE(Run length Encoded)的图像.文件内容包括文件头(一个BITMAP FILEHEADER数据结构).位图信息数据块(位图信息头BITMAP INFOHEADER和一个颜