直方图匹配matlab
时间: 2023-10-31 21:54:53 浏览: 153
直方图匹配(Histogram Matching)是一种将原图像的直方图映射到给定的目标直方图的方法,从而使新图像的直方图分布类似于目标直方图的过程。在Matlab中,直方图匹配可以通过以下步骤来实现:
1. 首先,求给定函数的累积直方图s。
2. 然后,求原图像的累积直方图G。
3. 接着,计算s中每个值在G中距离最小的位置index。
4. 最后,将原图像的每个像素通过index映射到新的像素值。
下面是通过Matlab实现直方图匹配的示例代码:
```matlab
clear all;
close all;
clc;
% 定义给定的函数
r = 127;
x = -r:r;
sigma = 20;
y1 = exp(-((x-80).^2)/(2*sigma^2));
y2 = exp(-((x+80).^2)/(2*sigma^2));
y = y1 + y2; % 双峰高斯函数
% 求原图像的直方图
img = imread('lena.jpg');
[m, n = size(img);hist = imhist(img);
p = hist / (m * n);
% 计算累积直方图
s = zeros(1, 256);
for i = 1:256
s(i) = sum(y(1:i));
end
% 寻找最近的对应像素值
index = zeros(1, 256);
for i = 1:256
tmp = G - s(i);
tmp = abs(tmp);
[~, index(i)] = min(tmp);
end
% 映射到新的像素值
imgn = zeros(m, n);
for i = 1:m
for j = 1:n
imgn(i, j) = index(img(i, j) + 1) - 1; % 由原图的灰度通过索引映射到新的灰度
end
end
imgn = uint8(imgn);
% 显示新图像和新图像的直方图
figure;
imshow(imgn);
figure;
plot(imhist(imgn));
```
这段代码中,首先定义了给定的函数(双峰高斯函数),然后通过求原图像的直方图和给定函数的累积直方图,找到最近的对应像素值,最后将原图像的每个像素通过索引映射到新的像素值,得到匹配后的新图像。
阅读全文