MATLAB--数字图像处理 图像直方图均衡化
图像直方图均衡化
首先,我们要理解什么是图像直方图均衡化:
把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布,具体见下图(说的简单点,就是把原来的图像的灰度分配均匀,使得0-255都有一定的取值,这样对比度相对大一些,视觉上更好看一点):
这里我们可以直接利用histeq()、adapthisteq()函数对图像进行均衡化
H= imread('a1.jpg');
if length(size(H))>2H=rgb2gray(H);
end
subplot(3,2,1);
imshow(H); title('原图');
subplot(3,2,2);
imhist(H); title('原图直方图');
subplot(3,2,3);
H1=adapthisteq(H);
imshow(H1); title('adapthisteq均衡后图');
subplot(3,2,4);
imhist(H1);title('adapthisteq均衡后直方图');
subplot(3,2,5);
H2=histeq(H);
imshow(H2); title('histeq均衡后图');
subplot(3,2,6);
imhist(H1); title('histeq均衡后直方图');
效果图:
当然,我们也可以自己编写均衡化函数,首先就要了解均衡化的算法步骤(这里我就不多说了)
上代码:
H= imread('a1.jpg'); %判断是否为三通道彩色图片 若是 则将其灰度化
if length(size(H))>2H=rgb2gray(H);
end%获取图片的尺寸 便于计算总像素数 即m*n
[m,n]=size(H); %生成一个一行256列的矩阵
p=zeros(1,256); % 统计各灰度的像素个数
%find(H==i) 是在图像矩阵里面寻找灰度为i的点坐标
% 因为矩阵是从1开始的 所以为p(i+1)
for i=0:255 p(i+1)=length(find(H==i))/(m*n);
end subplot(2,2,1);
imshow(H);
title('原图');
subplot(2,2,2);
% 显示原图的直方图
bar(0:255,p,'b');
title('原图直方图'); % 利用循环 累加概率值
s=zeros(1,256);
for i=1:256 for j=1:i s(i)=p(j)+s(i); end
end %对s中的数先乘以255,再取整
a=round(s*255);
b=H;
%更新原图像的灰度
for i=0:255 b(find(H==i))=a(i+1);
endsubplot(2,2,3);
imshow(b)
title('均衡化后图像'); %统计更新后的概率
for i=0:255 GPeq(i+1)=sum(p(find(a==i)));
end
subplot(2,2,4);
bar(0:255,GPeq,'b'); title('均衡化后的直方图');
效果图:
方法二(从大佬那里copy的)
Img= imread('a1.jpg');
if length(size(Img))>2Img=rgb2gray(Img);
end%绘制原始图像的直方图
[height,width]=size(Img);
[counts1, x] = imhist(Img,256);
counts2 = counts1/height/width;
figure(1),
subplot(1,2,1),
imshow(Img);title('原始图像');
subplot(1,2,2),
stem(x, counts2); title('原始图像直方图');%统计每个灰度的像素值累计数目
NumPixel = zeros(1,256);%统计各灰度数目,共256个灰度级
for i = 1:height for j = 1: width %对应灰度值像素点数量+1 %NumPixel的下标是从1开始,而图像像素的取值范围是0~255,所以用NumPixel(Img(i,j) + 1) NumPixel(Img(i,j) + 1) = NumPixel(Img(i,j) + 1) + 1; end
end %将频数值算为频率
ProbPixel = zeros(1,256);
for i = 1:256 ProbPixel(i) = NumPixel(i) / (height * width * 1.0);
end %函数cumsum来计算cdf,并将频率(取值范围是0.0~1.0)映射到0~255的无符号整数
CumuPixel = cumsum(ProbPixel);
CumuPixel = uint8(255 .* CumuPixel + 0.5); %直方图均衡。赋值语句右端,Img(i,j)被用来作为CumuPixel的索引
for i = 1:height for j = 1: width Img(i,j) = CumuPixel(Img(i,j)+1); end
end %显示更新后的直方图
figure(2),
subplot(1,2,1),
imshow(Img); title('直方图均衡化图像');
[counts1, x] = imhist(Img,256);
counts2 = counts1/height/width;
subplot(1,2,2),
stem(x, counts2); title('直方图均衡化后图像的直方图');
上面都是对灰度图片进行均衡化,那么对彩色图片怎么均衡化呢?办法肯定是有的。我们知道,彩色图片无非就是RGB三通道组成的,只要我们分别对三个通道进行均衡化,再合成,得到的图片就是彩色的,均衡化后的。
上代码:
Img= imread('a1.jpg');
OutImg=Img;
%分别提取三通道的信息
R = Img(:,:,1);
G = Img(:,:,2);
B = Img(:,:,3); %分别对三通道的图片进行均衡化
R = histeq(R, 256);
G = histeq(G, 256);
B = histeq(B, 256); %最后合成为一张图片
OutImg(:,:,1) = R;
OutImg(:,:,2) = G;
OutImg(:,:,3) = B; figure,
subplot(1,2,1),
imshow(Img);title('原始图像');
subplot(1,2,2),
imshow(OutImg); title('均衡化后结果');
效果图(感觉颜色更加丰富了,哈哈):
这里其实还有一种方法,就是先把RGB转换为HSV,再均衡化
上代码:
mg= imread('a1.jpg');
hsvImg = rgb2hsv(Img);
V=hsvImg(:,:,3);
[height,width]=size(V); V = uint8(V*255);
NumPixel = zeros(1,256);
for i = 1:height for j = 1: width NumPixel(V(i,j) + 1) = NumPixel(V(i,j) + 1) + 1; end
end ProbPixel = zeros(1,256);
for i = 1:256 ProbPixel(i) = NumPixel(i) / (height * width * 1.0);
end CumuPixel = cumsum(ProbPixel);
CumuPixel = uint8(255 .* CumuPixel + 0.5); for i = 1:height for j = 1: width V(i,j) = CumuPixel(V(i,j)+1); %注意,这里需要+1,要不然会出问题end
end V = im2double(V);
hsvImg(:,:,3) = V;
outputImg = hsv2rgb(hsvImg);
figure,
subplot(1,2,1),
imshow(Img);title('原始图像');
subplot(1,2,2),
imshow(outputImg); title('在HSV空间均衡化后结果');
效果图(感觉没有上一种方法好看,这个其实是要分图片的):
更多
获取更多资料、代码,微信公众号:海轰Pro
回复 海轰 即可
MATLAB--数字图像处理 图像直方图均衡化相关推荐
- Matlab数字图像处理——图像的空间变换
Matlab空间变换函数 imtransform Matlab空间变换函数 imtransform 可以实现图像仿射变换(如 平移.旋转.剪切.缩放).投影变换, 该函数可与 maketform 配合 ...
- 【数字图像处理】直方图均衡化详解及编程实现
直方图均衡化的英文名称是Histogram Equalization. 图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法.直方图拉伸和直方图均衡化是两种最常见的间 ...
- matlab数字图像处理——图像的读写,灰度、二值图像
一.实验目的 1.结合数字图像处理的知识,直观感受图像处理的基本实现过程 2.熟悉MATLAB工具的使用 3.了解图像的读写和显示 二.实验内容 实验内容一:图像读取 (1)利用编程实现读取图像 利用 ...
- 【数字图像处理】直方图均衡化与规定化
目录 直方图处理技术概述 直方图均衡化 公式推导 Matlab代码实现 图像的规定化 数学推导 单映射 Matlab代码 效果展示编辑 组映射 Matlab代码 直方图处理技术概述 灰度级范围[0, ...
- 【数字图像处理】直方图均衡化
全局直方图均衡化 直方图均衡化通过调整图像的直方图来增强图像的对比度,经常使用在医学图像分析中. 例如一幅8*8图像像素值如下: 对各个像素值进行计数: 得到累计概率分布: 其中均衡化后的像素值计算公 ...
- 数字图像处理之直方图均衡化(python)
1.概念 直方图均衡化 主要用于增强动态范围偏小的图像的反差. 直方图均衡化借助灰度统计直方图和灰度累积直方图来进行.灰度统计直方图反映了图像中不同灰度级的像素的个数:灰度累积直方图 反 ...
- Matlab数字图像处理——图像处理工具箱Image Processing Toolbox
Image Processing Toolbox 图像处理工具箱包含的功能: 图像的读取和保存 图像的显示 创建GUI 图像的几何变换 图像滤波器设计及线性滤波 形态学图像处理 图像域变换 图像增强 ...
- Matlab数字图像处理——图像文件的读取
文章目录 一.Matlab中获取图像信息的函数 imfinfo 二.Matlab读取图像文件的函数 imread 三.Matlab保存图像文件的函数 imwrite 完整目录 一.Matlab中获取图 ...
- Matlab数字图像处理 02 灰度变化(图像直方图、直方图均衡化、直方图匹配)
第二章 灰度变化 2.1 图像的亮度.对比度和动态范围 2.1.1 亮度 2.1.2 对比度 2.1.3 动态范围 2.2 线性灰度变换 2.2.1 具有饱和处理的线性灰度变换 2.2.2 分段线性灰 ...
- 【数字图像处理】图像直方图均衡化、空域滤波(均值滤波、中值滤波)、图像锐化(Laplace算子)、图像傅里叶变换实验
图像直方图均衡化.空域滤波.图像锐化.图像傅里叶变换 一.图像直方图均衡化 二.图像空域滤波 1.均值滤波(滤波次数n→3) 2.中值滤波(滤波次数n→3) 3.图像锐化(Laplace算子) 三.图 ...
最新文章
- 四位先行进位电路逻辑表达式_计算机硬件基础:二进制半加器、全加器与加法电路...
- 域名解析跳转到另一个域名_github建立静态网站,域名解析和跳转
- Python基础练习题:猜数字小游戏
- gulp + webpack 构建多页面前端项目 1
- Python 爬虫利器一之 Requests 库的用法
- java定时器小程序_【微信小程序】使用setTimeout试试定时器
- 浏览器加载渲染网页过程解析-总结
- 解读InnoDB页面--索引结构
- 向量积的二维物理意义,二维向量叉乘几何意义
- 一起来讨论:车联网+区块链的ROAD,是好是坏?
- 如何利用python画三棱锥_玩转CSS 3D -正四面体与正六面体
- winfrom给word加水印
- CentOS6.5下MariaDB日志及事物详解和基本操作语句
- 指纹识别综述(8): 唯一性
- 特斯拉与Uber达成协议,为Uber伦敦司机提供电动汽车
- 【移动网络】Ch. 1 5G标准化与频谱
- Kali Linux安装配置JDK1.8
- 书呆子rico_Excel书呆子优胜者的非常恐怖的秋季赠品
- Cypress设置Cookie
- 多功能计算器1.0.4
热门文章
- 一、CPU寄存器说明
- 配置authorized_keys让服务器A免密登录服务器B
- [转载]【苹果千层派】轻松玩转酥皮_万金油_新浪博客
- 【附源码】计算机毕业设计java学科竞赛管理设计与实现
- 最长等差数列_算法题10 最长等差序列问题
- 详解 JavaScript 的发展史
- Lab: Username enumeration via different responses:通过不同的响应来验证用户名是否正确复盘
- 常见Http响应头部 responses header
- 计算机科学与技术高校毕业生要求,计算机科学与技术专业 毕业要求(2016)
- 解决h5兼容ios手机浏览器下载本地文件直接打开问题。