直方图是一种基本的数据分析工具,用于图形化表示数据分布情况。它将数据分成若干个小区间,统计每个区间内数据出现的频数或概率分布,然后通过绘制柱状图来展示。在Matlab中,绘制直方图非常简单,Matlab提供了直方图绘制函数“histogram()”,并且在2014b版本之后,Matlab还提供了更为丰富的绘图功能。
绘制简单的直方图
在Matlab中,绘制简单的直方图非常简单,只需要简单几步操作即可完成。下面我将详细介绍如何使用Matlab绘制简单的直方图。
首先,我们需要准备好数据。在这里,我将使用Matlab自带的“peppers.png”文件作为例子,读入图片的灰度值作为数据,如下所示:
I = rgb2gray(imread('peppers.png')); %读取peppers.png图片,并将其转换为灰度图像
data = I(:); %将灰度图像压缩成一列Copy
接下来,我们就可以将数据传入“histogram()”函数,绘制直方图了:
histogram(data); %绘制直方图Copy
执行上面的代码,会得到如下直方图:
是不是非常简单?可以看到,绘制直方图只需要几行代码。
三、复杂的直方图
但是,在实际情况下,我们通常需要绘制更加复杂的直方图,如分组直方图、双轴直方图等等。在这里,我将分别介绍如何绘制分组直方图和双轴直方图。
1. 分组直方图
分组直方图可以用于比较不同数据组之间的分布情况。在Matlab中,我们可以通过设置“BinEdges”参数来控制数据的分组情况。例如,我们可以将数据分为10个区间,如下所示:
histogram(data,'BinEdges',0:25:255); %将数据分为10个区间,每个区间25个灰度级Copy
执行上面的代码,会得到如下的分组直方图:
2. 双轴直方图
双轴直方图可以将两个不同的数据集绘制在同一张直方图上,通过分别使用左轴和右轴来表示不同的数据集。在Matlab中,我们可以利用“yyaxis”函数来实现双轴直方图的绘制。
例如,我们可以同时绘制出原始图像的灰度分布和对比度分布:
[counts,grayvals] = imhist(data); %统计原始图像的灰度分布
[~, T] = graythresh(I); %计算原始图像的二值化阈值
bw = im2bw(I,T); %将原始图像二值化
[contrastCounts,contrastVals] = imhist(bw); %统计二值化图像的对比度分布
yyaxis left %使用左轴
histogram(data, 'Normalization', 'pdf', 'BinEdges', 0:255); %用灰线绘制原始图像的灰度分布
hold on
yyaxis right %使用右轴
histogram(bw, 'Normalization', 'pdf', 'BinEdges', 0:255); %用蓝线绘制二值化图像的对比度分布
hold offCopy
执行上面的代码,会得到如下:
在Matlab中绘制直方图可以使用`histogram`命令。下面是一个简单的步骤指南:
1. 提供数据:将要绘制直方图的数据存储在一个向量或矩阵中。假设数据存储在变量`data`中。
2. 绘制直方图:使用`histogram(data)`命令来绘制直方图。默认情况下,该命令将根据数据自动选择合适的箱宽和箱数,并绘制直方图。例如:```matlabdata = [1, 2, 3, 3, 4, 5, 6, 6, 6, 7, 8];histogram(data);```
3. 自定义直方图:你还可以根据需要自定义直方图。例如,可以设置箱宽、箱数、边界值等。以下是一些示例:
```matlab% 设置箱数为10histogram(data, 'NumBins', 10);% 设置自定义边界值histogram(data, 'BinEdges', [1, 3, 5, 8]);% 设置箱宽为2histogram(data, 'BinWidth', 2);% 同时自定义多个参数
histogram(data, 'BinEdges', [1, 3, 5, 8], 'DisplayStyle', 'stairs', 'EdgeColor', 'r');```
4. 添加标题和标签:你可以使用`title`、`xlabel`和`ylabel`命令为直方图添加标题和标签。例如:```matlabtitle('Histogram');xlabel('Values');ylabel('Frequency');```
这样就可以根据自己的需求绘制和自定义直方图了。希望这个指南对你有所帮助!