You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 05:15:21