Octave 6.4.0中获取histeq变换并绘制直方图均衡化曲线
在Octave 6.4.0中获取histeq的灰度变换并绘制
Octave的histeq确实不像Matlab那样直接返回变换矩阵T,但你可以手动计算这个均衡化变换,核心是基于输入图像的累积分布函数(CDF)推导映射关系,步骤如下:
1. 计算输入图像的直方图与累积分布函数
假设输入图像I是8位灰度图(像素值范围0-255):
% 读取或准备灰度图像I I = imread('your_image.png'); I = rgb2gray(I); % 彩色图需先转灰度 % 计算直方图,bin数设为256覆盖所有灰度级 [h, bins] = hist(I(:), 0:255); % 计算归一化累积直方图(CDF) cdf = cumsum(h) / numel(I);
2. 推导灰度变换T
Matlab中histeq的变换T是输入灰度值到输出灰度的映射,由归一化CDF缩放得到:
% 将CDF映射到0-255灰度范围 T = round(cdf * 255); % 转为列向量,确保对应输入灰度0-255的索引逻辑 T = T(:);
这里T(k)对应输入灰度值k-1(Octave索引从1开始)的输出灰度值,和Matlab返回的T逻辑完全一致。
3. 验证变换正确性
用推导的T生成均衡化图像,和Octave原生histeq输出对比:
% 用T生成均衡化图像 J_from_T = T(I + 1); % 输入灰度0-255加1转为1-256索引 J_octave = histeq(I); % Octave原生histeq输出 % 检查两幅图的差异(因浮点精度差异极小) max(abs(J_from_T(:) - J_octave(:)))
4. 绘制变换曲线
直接用plot函数绘制T随输入灰度的变化曲线:
figure; plot(0:255, T, 'LineWidth', 1.5); xlabel('输入灰度值'); ylabel('输出灰度值'); title('histeq灰度变换曲线'); grid on;
补充:匹配指定目标直方图的情况
如果是用histeq(I, hspec)匹配到指定直方图hspec,变换T需基于目标直方图的CDF推导:
% 计算目标直方图的归一化CDF cdf_spec = cumsum(hspec) / sum(hspec); % 输入CDF与目标CDF的近似最近邻匹配 T = zeros(256, 1); for k = 1:256 [~, idx] = min(abs(cdf(k) - cdf_spec)); T(k) = idx - 1; % 转为0-255灰度值 end
内容的提问来源于stack exchange,提问作者hasanghaforian
相关产品推荐
相关产品推荐

