使用 cdf 对两个图像进行直方图匹配

信息处理 图像处理 图片 直方图
2022-02-22 21:53:17

我已经计算了每个图像的 cdf 值,现在我必须将参考图像值映射到 target 。我不能使用直方图均衡或插值,我只需要映射它们。

function S = histM(t, target)
 if size(target,2)>1
   %an image, replace the image with its cdf
   target = getImageCDF(target);
 end

%get the CDF for the input image
 tcdf = getImageCDF(t);

% .... what shall be done here to map the values of reference to target

%subfunction: compute the CDF for an image that started as uint8
 function cdf = getImageCDF(img)
 bins = 0:255;
 H = hist(img(:), bins);
 Hmod = H + eps(sum(H));
 cdf = [0, cumsum(Hmod)/sum(Hmod)];
1个回答

首先,您必须计算两个图像之一的直方图。

H = hist(img(:), bins);

接下来找到图像的cdf:

 cdf = [0, cumsum(Hmod)/sum(Hmod)];

接下来,您必须使第二张图片遵循与第一张图片完全相同的 cdf。这通常称为直方图规范。这是算法:

假设你有一个3 bit图像,那就是8不同的强度值0>7. 现在至于第二张图片

找到它也是 cdf。

现在如下图所示。rk是第二张图像的像素值。

sk是第二张图片的 cdf。

zk是 firsk 图像的 cdf(所需的直方图)。

zkn计算如下:

(zksk)>=0对于最小值nn=gk

究竟如何:让我们计算一下zk

zksk=00.15=0.15>!0(不大于零)增加zk并保持sk原样,直到您满足标准。

直到你达到: 0.150.15=0>=0(检查)然后zk=zk n=rk

在此处输入图像描述

以下是一些插图图片:

在此处输入图像描述

在此处输入图像描述 在此处输入图像描述

在此处输入图像描述

在此处输入图像描述