FPGA数字图像处理实战——直方图均衡化变换(Verilog)
目录/
(资料图片)
● 图像直方图均衡化实现
01
图像直方图均衡化概述
在中对图像直方图(Histogram)的概念和重要意义进行了介绍:图像直方图
1.1 图像直方图均衡化原理
直方图均衡化是通过重新分布图像像素的灰度级别,使得原本集中在某些灰度级别的像素在整个灰度范围内均匀分布,从而扩展图像的动态范围,增强图像的对比度,使得图像细节更加清晰。
假设针对某图像,n表示像素总数,ni表示像素的灰度级,P(ri)表示灰度级ni出现的概率。那么图像灰度级ni在均衡化后对应像素值sk的计算公式如下,
按照公式对图像进行均衡化处理,处理前后图像和对应直方图如图所示。原图的直方图分布较为集中,均衡化后图像的直方图分布较为分散,从而扩展像素值的分布范围。随着像素值分布范围扩大,图像像素点之间的对比度提高,从而使图像更加清晰、鲜明。
直方图均衡化是一种全局处理算法,当图像存在明显的局部亮度差异时,直方图均衡化可能会导致图像过亮或过暗,同时有可能放大图像中的噪声,导致图像质量下降或细节信息丢失。针对这类问题,通常可以使用自适应直方图均衡化算法,将图像划分为多个小区域,对每个区域分别进行直方图均衡化,从而保留图像的局部信息。
1.2 图像直方图均衡化应用
直方图均衡化作为一种图像增强算法,通过扩大直方图分布范围提高图像的对比度,在图像处理和计算机视觉领域有着广泛的应用:
图像压缩:通过改变图像直方图分布,增强图像对比度,可以有效提高压缩算法的效果和压缩比;
光照矫正:通过调整图像的亮度分布,保证图像在不同光照条件下的一致性,使图像之间可比较;
背景消除:通过增强前景目标与背景之间的对比度,可以有效分离前景和背景,从而消除背景;
医学影像处理:通过提高以X射线图像为代表的医学影像的对比度,可以帮助医生更好得诊断病症;
视频图像处理:在视频监控、视频剪辑和电影制作等领域,增强图像对比度可以提高视频的质量和视觉效果。
02
图像直方图均衡化实现
直方图均衡化的具体实现主要按照以下四个步骤:
计算原始图像的直方图:统计每个灰度级别的像素数量;
计算累计分布函数(CDF):通过对灰度直方图进行累加,得到每个灰度级别的累积概率;
基于CDF进行灰度级别映射:将CDF的值线性映射到新的灰度级别范围,从而获得映射函数;
应用映射函数:将原始图像中每个像素的灰度级别替换为映射函数计算得到的新的灰度级别。
2.1 图像直方图均衡化Matlab代码
基于灰度直方图统计Matlab代码实现直方图均衡化:
注:“FPGA数字图像处理基础(二)——灰度直方图统计(Verilog)”已实现图像灰度值统计,关注公众号 Cascatrix。
Matlab直方图均衡化代码:
%**********************************************************************
% -------------------------------------------------------------------
% Company: Cascatrix
% Engineer: Carson
%
% Create Date: 2023/08/22
% Design Name: histogram_equalization
% Module Name: histogram_equalization
% Tool Versions: v1.0
% Description: histogram equalization of gray image
%-------------------------------------------------------------------
%*********************************************************************/
clear;close all;clc;
% Image resolution
row = 1080;
col = 1920;
% Create output image
image_in = uint8(zeros(row,col));
% Write data into output image
FileImage = fopen("image_origin.txt","r");
for x = 1:row
for y = 1:col
Gray = fscanf(FileImage,"%s",1);
image_in(x,y) = uint8(hex2dec(Gray(1:2)));
end
end
% Calculate histogram value of image
[H,D] = imhist(image_in);
% Calculate and store quantitized pixel data
sum = 0;
LUT = zeros(1,256);
image_hist = zeros(row,col);
for i = 1:256
sum = sum + H(i);
LUT(i) = round(255 * 1.0 * sum / (row * col));
end
% Image histogram equalization
for i = 1:row
for j = 1:col
image_hist(i,j) = LUT(image_in(i,j)+1);
end
end
% Transfer double to uint8
image_out = uint8(image_hist);
% Before histogram equalization
subplot(221);
imshow(image_in);
title("image in");
subplot(222);
imhist(image_in);
title("histogram of image in");
% After histogram equalization
subplot(223);
imshow(image_out);
title("image out");
subplot(224);
imhist(image_out);
title("histogram of image out");
Matlab代码将输出结果:
通过上述图像及其直方图对比可以发现:像素值相对集中的输入图像image_in在直观色彩上表现得更加暗淡、色彩对比度不足,经过直方图均衡化处理后的输出图像image_out有效处理原始图像对比度上的不足,使图像更加清晰、鲜明。
2.2 图像直方图均衡化Verilog代码
基于灰度直方图统计工程,对图像直方图进行均衡化处理并输出,核心模块直方图统计模块 cx_histogram.v:
注:“FPGA数字图像处理基础(二)——灰度直方图统计(Verilog)”已实现图像灰度值统计,关注公众号 Cascatrix。
Verilog仿真生成image_equalized.txt文件存储直方图均衡化后的图像数据:
2.3 实现效果分析
通过对比Matlab显示直方图均衡化后的图像数据image_equalized.txt文件,图像对比度得到有效提高: