Histogram Equalization in Matlab

2023-10-08 16:38

本文主要是介绍Histogram Equalization in Matlab,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

title: Histogram Equalization in Matlab
date: 2014-10-04 11:06:15
categories: Digital Image Processing
tags:
- Digital Image Processing
- Computer Vision
- Algorithm


算法需求

要求如下:

Histogram Equalization (test images: fig1.jpg, fig2.jpg)
a. Write a computer program for computing the histogram of an image.
b. Implement the histogram equalization technique.
c. Your program must be general to allow any gray-level image as its input.

简单说,就是实现一个直方图均衡化的程序。

直方图均衡化的好处多多,直观讲,就是可以让图像颜色变化更加均匀,使得太暗的部分显示出更多的细节。

下面介绍算法的主要思路。

主要参考了维基百科的文章。

算法步骤

  1. 获取原始图像信息,并转化为灰度图像,获得图像信息矩阵;

  2. 统计不同灰度的频数分布P(gray_value) ni n i 为该灰度值的像素点的数量;

    Px(i)=p(x=i)=ni P x ( i ) = p ( x = i ) = n i

  3. 计算得到灰度的概率分布累积函数cdf,即cumulative distribution function;

    cdf_x(i)=_j=0ip_x(j) c d f _ x ( i ) = ∑ _ j = 0 i p _ x ( j )

  4. 对累积分布函数进行均衡化:

    P_y(i)=T[cdf_x(i))] P _ y ( i ) = T [ c d f _ x ( i ) ) ]

其中 T(x) T ( x ) 是关于 x x 的一个转化函数,在这里我们定义 T

P_x(i)=round[cdf(v)cdf_minMNcdf_min×(Graylevel2)]+1 P _ x ( i ) = r o u n d [ c d f ( v ) − c d f _ m i n M ∗ N − c d f _ m i n × ( G r a y l e v e l − 2 ) ] + 1

  1. 接下来我们可以利用新的 cdf c d f 值对原始图像进行均一化:
    Image(i,j)=cdf_y(k) I m a g e ( i , j ) = c d f _ y ( k )

代码及解析

  • 读取图像,检测是否为灰度图像,否则转化为灰度图,并获得图像信息矩阵pic_ori
clear all
pic_ori = imread('./images/Fig1.jpg');
size = size(pic_ori);
if( numel(size) > 2 ) % Function ISRGB has been removed.pic_ori = rgb2gray(pic_ori);size = size(pic_ori);
end
height = size(1);
width = size(2);
gray_level = 256; % the number of grey levels used
  • 显示未处理图像
figure,imshow(pic_ori) % Image before processing
title('未处理图像') % * 获取灰度值频数分布
P = zeros(gray_level,1);
for i = 1:heightfor j = 1:widthgray_value = pic_ori(i,j)+1; % P(0); index must be a positive % integer or logical.P(gray_value) = P(gray_value) + 1;end
end
  • 获得灰度值累积分布
cdf = zeros(gray_level,1);
cdf(1) = P(1);
cdf_min = 0;
for i = 2:gray_levelcdf(i) = cdf(i-1) + P(i);if(cdf_min == 0 && cdf(i) > 0)cdf_min = cdf(i);end
end
  • 对灰度值累积分布进行转化
cdf_equal = zeros(gray_level, 1);
for i = 1:gray_levelcdf_equal(i) = round( (cdf(i)-cdf_min) / (height * width - cdf_min) * (gray_level - 1) ) + 1;
end
  • 计算图像像素点新的灰度值
pic_equal = pic_ori;
for i = 1:heightfor j = 1:widthpic_equal(i,j) = cdf_equal( pic_equal(i,j) + 1 );end
end
  • 显示均衡化后的图像
figure,imshow(pic_equal) % Image after equalization   
title('均衡化后图像')  
  • 显示直方图的函数是
figure    
subplot(221)    
imshow(pic_ori)%显示原始图像    
subplot(222)    
imhist(pic_ori)%显示原始图像直方图   

结果展示

原始图像如图
原始图像1
原始图像2

可以比较明显地看到,两幅图像的灰度变化更为均匀。
图像1的灰度直方图变化
图像2的灰度直方图变化

这篇关于Histogram Equalization in Matlab的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/166621

相关文章

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征

MATLAB的fix(),floor()和ceil()函数的区别与联系

fix(x),floor(x)和ceil(x)函数都是对x取整,只不过取整方向不同而已。 这里的方向是以x轴作为横坐标来看的,向右就是朝着正轴方向,向左就是朝着负轴方向。 fix(x):向0取整(也可以理解为向中间取整) floor(x):向左取整 ceil(x):向右取整 举例: 4个数:a=3.3、b=3.7、c=-3.3、d=-3.7 fix(a)=3 fl

MATLAB中的eig函数

在MATLAB中,计算矩阵A的特征值和特征向量的函数是eig(A),常用的调用格式有5种: E=eig(A):求矩阵A的全部特征值,构成向量E。 [V,D]=eig(A):求矩阵A的全部特征值,构成对角阵D,并求A的特征向量构成V的列向量。 [V,D]=eig(A,'nobalance'):与第2种格式类似,但第2种格式中先对A作相似变换后求矩阵A的特征值和特征向量,而格式3直接求矩阵A的特

MATLAB中的diag函数

diag函数功能:矩阵对角元素的提取和创建对角阵 设以下X为方阵,v为向量 1、X = diag(v,k)当v是一个含有n个元素的向量时,返回一个n+abs(k)阶方阵X,向量v在矩阵X中的第k个对角线上,k=0表示主对角线,k>0表示在主对角线上方,k<0表示在主对角线下方。例1: v=[1 2 3]; diag(v, 3) ans =      0     0     0

Matlab simulink建模与仿真 第十章(模型扩展功能库)

参考视频:simulink1.1simulink简介_哔哩哔哩_bilibili 一、模型扩展功能库中的模块概览         注:下面不会对Block Support Table模块进行介绍。 二、基于触发的和基于时间的线性化模块 1、Trigger-Based Linearization基于触发的线性化模块 (1)每次当模块受到触发时,都会调用linmod或者dlinmod函数