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
- 1
- 2
- 3
其中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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
变换图像名也可以由用户input
指定,默认为lena图:
imread
读出图片,返回值第一个是我们需要的灰度图(二维矩阵)- 对变换后的灰度图,用
imshow
在figure
中显示图像
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)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
在这个实验的操作中说明如何读入、显示,后面实验不在赘述
(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 : wfor j = 1 : hx = new(i, j);if x < x1new(i, j) = k1 * x;elseif x < x2new(i, j) = dk1 * (x - x1) + y1;elsenew(i, j) = dk2 * (x - x2) + y2;endendend
end
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
这里不可避免要使用到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 : wfor j = 1 : hg = original(i, j);if g >= low && g <= highg = g - low + 1;result(g) = result(g) + 1; endendendend
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
然后就使用Matlab条形图作图函数bar
完成灰度图作图:
y = GrayScaleStatistic(original, low, high);
x = low : 1 : high;
bar(x, y)
- 1
- 2
- 3
对于题目要求的可输入灰度区间显示,我们要么不统计区间[low, high]以外的灰度值,要么直接全部统计但在作图时用xlim
函数限制x轴取值范围:
xlim([low, high])
- 1
(3)运行结果
对比Matlab标准直方图作图函数histogram
,结果如下:
也可以通过input输入限定区间,这里是[20,150]区间的灰度直方图:
左右对比,效果一致。
4.直方图均衡化
(1)直方图均衡算法
直方图均衡主要用于增强动态范围偏小的图像的反差,其基本思想是把原始图像的直方图变换为均匀分布,从而增强灰度值的动态范围,以达到增强对比度的效果。
直方图均衡化算法如下
- 归一化灰度频数直方图,得到频率直方图
sk
- 用
sk
计算频率累计直方图tk
, tk
做取整扩展:tk = int[(L - 1) * tk + 0.5]
,将直方图灰度映射尽量满整个灰度取值空间L
- 确定变换映射关系
k->tk
- 根据映射关系变换图像灰度值
(2)代码实现
在脚本中调用Normalize函数直接得到均衡化后的图像,再统计直方图并显示。
Normalize函数如下:
function [ new ] = Normalize( original, v )s = sum(v);tv = v / s;l = length(v);for i = 2 : ltv(i) = tv(i) + tv(i - 1);endtk = uint8(255 * tv + 0.5);w = size(original, 1);h = size(original, 2);new = original;for i = 1 : wfor j = 1 : hnew(i, j) = tk(original(i, j) + 1);endendend
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
说明:
- tv先计算频率直方图,再通过累加得到累计直方图
- tk根据累计直方图计算新的灰度映射关系
- 最后遍历整个图像把原灰度转换成均衡化后的灰度值
其中有一下几点需要注意,也是Matlab图操作的注意点:
- Matlab默认类型是double,对灰度值赋值时注意强制转换类型,保证类型一致
- Matlab坐标起始从1开始,而灰度值是uint8的0-255,因此映射数组tk把原始灰度映射到变换后灰度时需要加1
(3)结果展示
pout.bmp是一副灰度分布较为集中的图像,因此图像对比度不高,显示较为模糊。使用直方图均值化,分散灰度分布从而增强对比度:
通过对比均衡先后直方图分布,可以发现:
- 灰度分布不能完全平均化,是由于均值化算法中运用了取整运算,而不是离散值的完全均衡化
- 得到的均衡化后直方图走势没有发生变化,因此图像没有失真
Matlab图像处理系列1———线性变换和直方图均衡相关推荐
- Matlab图像处理基础(1):图像表示,点处理
目录 0. 概要 1. 图像表示 Image Representation 1.1 图像格式 Image format 1.2 图像分辨率 resolution of image 1.3 图像的编码 ...
- matlab图像处理命令(二)
转自:http://blog.163.com/crazyzcs@126/blog/static/1297420502010229104452729/ (非原处) 图像增强 1. 直方图均衡化的 Mat ...
- matlab图像相加例子,MATLAB图像处理例子
MATLAB图像处理例子 clc;clear all;close all; a = imread( railway_05.jpg ); b = rgb2gray(a); c = im2bw(b,240 ...
- Matlab 图像处理的一些杂记
图像直方图均衡- - Tag: matlab 图像处理 直方图均衡 % 数字图像处理程序作业 % 本程序能将JPG格式的彩色图像文件灰度化并进行直方图均衡 % % 输入文件:Pic ...
- 【matlab图像处理笔记5】【图像变换】(四)图像的正交变换
文章目录 推荐阅读 前言 图像正交变换简介 离散傅里叶变换 对图像进行离散傅里叶变换的作用 二维离散傅里叶变换 频谱图 示例 离散余弦变换 简介 基本原理 示例 推荐阅读 本系列其他文章 [matla ...
- 基于MATLAB图像处理
设计题目 图片叠加. 设计要求 将一幅礼花图片和一幅夜景图片做叠加运算,使达到烟花夜景的美图效果. 设计方案 3.1.设计思路 利用matlab强大的图像处理功能,通过编写程序,实现对两幅图片的像素进 ...
- 【matlab图像处理笔记4】【图像变换】(三)图像的霍夫变换
文章目录 推荐阅读 前言 霍夫变换概述 霍夫变换直线检测原理 从笛卡尔坐标系到霍夫空间 两点一线的霍夫空间形式 寻找共线的点 直角坐标系存在的问题 极坐标参数空间下的霍夫变换 matlab霍夫变换直线 ...
- 毕设题目:Matlab图像处理
1 案例背景 在社会信息化高速发展的今天,我们的身边被各种各样的信息包围着,人们在种类繁杂的各类信息中努力寻找属于自己的有用信息,从而使自己以更快的步伐追赶时代的潮流,以防被时代淘汰.随着计算机技术的 ...
- MATLAB图像处理_同态滤波1
原 MATLAB图像处理_同态滤波 2015年01月20日 09:54:25 风雨也无晴 阅读数:14234 <span class="tags-box artic-tag-box&q ...
- matlab图像处理常见函数及用法详解
matlab图像处理常见函数及用法详解 -- 整理于2022.12.2 ,23.05-- clc;clear;%% 图片读取 RGB = imread('1.jpg'); % 图片读取 imshow( ...
最新文章
- html标准模式与混杂模式,关于Doctype、严格模式与混杂模式
- 网站SEO优化技巧的“减法运算”
- 086_html5Input类型
- Linux网络流量实时监控ifstat iftop命令详解
- php遍历数组的四种方法,PHP遍历数组的常见几种方法
- 电脑w ndows无法自动修复,windows 10自动修复无法修复你的电脑
- 大数据计算:如何仅用1.5KB内存为十亿对象计数
- Service Worker,Web Worker,WebSocket的对比
- 知乎热议:杨辉团队公开否认抄袭,网友:避重就轻仍谎称「首创」
- 从 ReactiveCocoa 中能学到什么?不用此库也能学以致用
- 假定CSomething是一个类,执行下面这些语句之后,内存里创建了____个CSomething对象。...
- 【经典书】机器学习导论(附PDF)
- 阿里云服务器购买价格表:国内和国外地域云服务器活动报价表
- JavaScript基础教程第8版-例1-Bingo卡片游戏
- WinPE的制作 - 进WinPE后自动运行程序
- AutoCAD.NET实现CAD截图
- 开源中国社区开源项目排行榜
- Flutter 画面渲染的全面解析
- 赛车游戏java_Java 赛车游戏
- 文献阅读笔记 # Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks
热门文章
- 实用的CSS3属性和使用技巧
- ora-12514解决方法
- 【转】C/C++中宏使用总结
- Android开发 MeasureSpec介绍
- vgcreate 创建卷组
- mysql 一台电脑多个服务_怎么在一台windows主机上安装多个mysql服务
- ctf本地包括_GitHub - SewellDinG/LFIboomCTF: 本地文件包含漏洞实践源码及相应协议利用指南...
- 手机qq2008触屏版_手机版卖家中心在哪里
- 怎么从php文件中查找代码,php类在文件中查找类文件,但不查找类
- 基于python 爬虫_基于python的爬虫(一)