【matlab 图像处理2】直方图均衡化、规定化

直方图均衡化算法,对给定图像进行均衡化,灰度级数分别为2、64、256;

主函数

%% 请大家完成直方图均衡化函数 myHisteq.m,然后将本主程序中的变量
%% filename设置‘bridge’,运行main_histeq.m,即可得到直方图均衡化后的结果
%%
clc; 
clear;
close all;

%% 读取图片
filename = 'bridge'; %测试图像1
im = imread([filename, '.jpg']);
n_1 = 2;
n_2 = 64;
n_3 = 256;

% im = 2 * im - 55/255; % 提高对比度的图像
% im = 0.5 * im + 55/255; % 降低对比度的图像
% im = im + 120; % 增加亮度的图像
%% 将图像进行直方图均衡化
im_histeq_1 = myHisteq(im, n_1);
im_histeq_2 = myHisteq(im, n_2);
im_histeq_3 = myHisteq(im, n_3);

%% 将均衡化结果保存到当前目录下的result文件夹下
imwrite(im_histeq_1, sprintf('/%s_eq_%d.jpg', filename, n_1));
imwrite(im_histeq_2, sprintf('/%s_eq_%d.jpg', filename, n_2));
imwrite(im_histeq_3, sprintf('/%s_eq_%d.jpg', filename, n_3));

%% 显示结果(部分代码需补全)
figure(1); 
subplot(421); imshow(im); title('原图'); axis on
subplot(422); imhist(im); title('原图直方图');axis on                                                                      % 原图直方图 
subplot(423); imshow(im_histeq_1); title('直方图均衡化效果, n=2'); axis on
subplot(424); imhist(im_histeq_1); title('直方图');axis on                                                                        %'直方图均衡化, n=2'
subplot(425); imshow(im_histeq_2); title('直方图均衡化效果, n=64'); axis on 
subplot(426); imhist(im_histeq_2); title('直方图');axis on                                                                         % '直方图均衡化, n=64'
subplot(427); imshow(im_histeq_3); title('直方图均衡化效果, n=256'); axis on
subplot(428); imhist(im_histeq_3); title('直方图');axis on                                                                          % '直方图均衡化, n=256'

myHisteq函数
有一些乱码,是因为matlab版本问题,我就不删除了。可以直接运行的。有需要自己删除哈

function img_2 = myHisteq(img_1, n)
size_1 = size(img_1);

h = size_1(1);
w = size_1(2);
img_1 =double(img_1);
img_2 = zeros(h, w); %直方图�衡�的图�img_2矩阵�始化为0
L = 256;
NK = zeros(L,1);  %NK是图åƒ�的直方图分å¸?ä¸?»´æ•°ç»„256x1
for i = 1:h
    for j = 1:w% 循环é��åŽ†æ•´å¼ å›?
        num = img_1(i,j) + 1; %æ¯�个åƒ�ç´ ç‚¹çš„å…ƒç´ ä½œä¸ºä¸‹æ ‡ç´¢å¼• matlab里é�¢çš„第ä¸?¸ªæ•°ç»„å…ƒç´ ä¸‹æ ‡æ˜?ä¸�是0ï¼Œå› æ­¤è¿™é‡?1
        NK(num) = NK(num) + 1; % 对应的åƒ�ç´ ç‚¹ç´¯åŠ ã€?
    end %直方图分布就是å�„个åƒ�ç´ ç‚¹çš„é¢‘çŽ‡ç›´æ–¹å›¾ã€?-255åœ¨æ•´å¼ å›¾å‡ºçŽ°çš„æ¬¡æ•?
end
CH = zeros(L,1); %CH是图�的直方图的累计分布
for i = 1:L
    for j = 1:i
        CH(i) = CH(i) + NK(j); %ç´¯åŠ å‰�é�¢çš„åƒ�ç´ é¢‘çŽ?-->ç´¯åŠ ç›´æ–¹å›?
    end
end
%��化循�
i = 1:h; % (1,2,.....h)1xh数组
j = 1:w; % (1,2......w)1xw数组

% å…¬å¼� å�–整(ç�°åº¦å?*ç´¯åŠ ç›´æ–¹å›¾å½’ä¸?Œ–值)----> ç�°åº¦å€¼g
img_2(i,j) = round( (n-1) * CH(img_1(i,j) + 1)/(h * w)); % ch(img+1)/åƒ�ç´ æ€»ä¸ªæ•°æ˜¯ä¸ºäº†å½’ä¸€åŒ–ç´¯åŠ ç›´æ–¹å›¾

% f-->g æ˜ å°„å¯¹åº”å…³ç³»
img_2 = uint8(img_2 * L / (n-1));
end

【matlab 图像处理2】直方图均衡化、规定化_第1张图片

直方图规定化

f=imread('bridge.jpg');
%g=imread('building.jpg');
g=imread('lenna.jpg');
g=rgb2gray(g);
%f=rgb2gray(f);
%k=rgb2gray(k);
g1=imhist(g);
%k1=imhist(k);
match=histeq(f,g1);
%match2=histeq(f,k1);
figure;
subplot(231),imshow(f),title('原图像');
subplot(232),imshow(g),title('模板图像');
subplot(233),imshow(match),title('规定化后的图像');

subplot(234),imhist(f),title('原图像的直方图');
subplot(235),imhist(g),title('模板图像的直方图');
subplot(236),imhist(match),title('规定化后的图像的直方图')
% subplot(437),imshow(f),title('原图像');
% subplot(438),imshow(k),title('模板图像');
% subplot(439),imshow(match2),title('规定化后的图像');
% subplot(4310),imhist(f),title('原图像的直方图');
% subplot(4311),imhist(g),title('模板图像的直方图');
% subplot(4312),imhist(match),title('规定化后的图像的直方图')

【matlab 图像处理2】直方图均衡化、规定化_第2张图片
直方图的分布经过均衡化后,以模板直方图为参考,映射出来的最终的规定后的图像的直方图和模板直方图的分布很像,达到了,可以根据自己想要的方式改变直方图的分布,而不用像均衡化一样自动的修改分布。

你可能感兴趣的:(图像处理,计算机视觉,matlab,图像处理)