编程实现灰度图像的直方图均衡化算法 ➢使用Matlab实现,不能直接调用自带的histeq函数 ➢采用函数调用的方式:定义功能函数g=myhisteq(f)
时间: 2024-10-17 22:05:32 浏览: 38
灰度图像的直方图均衡化是一种增强图像对比度的技术,通过改变像素值的概率分布来提高图像的整体亮度均匀性和细节可见性。在Matlab中手动实现直方图均衡化的步骤如下:
1. **读取图像**:
首先,使用`imread`函数加载灰度图像,例如 `img = imread('image_name.jpg')`。
2. **计算直方图**:
使用`histcounts`或`histogram`函数计算图像的灰度值频率分布,如 `counts = histcounts(img(:), 256)`,这里256表示灰度等级范围。
3. **确定累积分布函数(CDF)**:
计算累积分布,即每个灰度级对应的概率,`cdf = cumsum(counts / numel(img))`。
4. **映射原图像的灰度值**:
对于原始图像中的每个像素值,找到其在CDF中的对应位置,然后将该位置的值作为新像素值。可以使用`interp1`函数进行线性插值,`new_img = interp1(linspace(0, 1, 256), linspace(0, 255, 256), img(:), 'linear')`。
5. **调整边界条件**:
如果原图像有边界像素,它们可能会超出新的灰度范围,这时需要处理好边界,通常可以选择0或最接近的灰度值。
6. **将结果转换回图像矩阵**:
最后,将新像素值组成的向量转换回图像格式,`equi_img = reshape(new_img, size(img))`。
完整的函数实现会像这样:
```matlab
function equi_img = myhisteq(img)
% 灰度直方图均衡化
gray_range = 256;
counts = histcounts(double(img(:)), gray_range);
cdf = cumsum(counts ./ numel(img));
% 创建等差灰度表
linear_range = linspace(1./gray_range, 1, gray_range);
new_img = interp1(linear_range, cdf, double(img(:)), 'linear');
% 处理边界像素
equi_img = uint8(min(max(new_img, 0), gray_range - 1));
end
```
阅读全文