Matlab数字图像处理基础【3】

来源:互联网 发布:淘宝网液晶电视机 编辑:程序博客网 时间:2024/04/29 08:56
第三章 图像的灰度映射和直方图均衡化
目录:
3.1 图像的灰度映射
    3.1.1 imadjust函数
    3.1.2 自定义灰度映射函数
3.2 直方图均衡化
    3.2.1 imhist函数/histeq函数
    3.2.2 自定义函数实现直方图均衡化

3.1 图像的灰度映射
3.1.1 imadjust函数

示例:

clc;

clear;

 

A = imread('flower_gray.jpg');

figure(1)

imshow(A);

A1 = imadjust(A, [], [], 0.2);

A2 = imadjust(A, [0.5;0.75], [0.1;0.2], 1);

figure(2)

imshow(A1);

figure(3)

imshow(A2);


3.1.2 自定义灰度映射函数
示例:

clc;

clear;

 

A =imread('flower_gray.jpg');

subplot(2,2,1);

imshow(A);

title('原图像');

 

x0 =0; y0 = 0;

x1 =75; y1 = 25;

x2 =180; y2 = 220;

x3 =255; y3 = 255;

subplot(2,2,2);

plot([x0,x1, x2, x3], [y0, y1, y2, y3]);

title('灰度映射关系');

 

k1 =(y1 - y0) / (x1 - x0);

b1 =y0 - k1 * x0;

k2 = (y2- y1) / (x2 - x1);

b2 =y1 - k2 * x1;

k3 =(y3 - y2) / (x3 - x2);

b3 =y3 - k3 * x3;

[m, n]= size(A);

A1 =double(A);

 

for i= 1:m

    for j = 1:n

        f = A1(i,j);

        g(i,j) = 0;

        if f < x1

            g(i,j) = k1 * f + b1;

        elseif f >= x1 && f <= x2

            g(i,j) = k2 * f + b2;

        else

            g(i,j) = k3 * f + b3;

        end

    end

end

 

A2 =mat2gray(g);

subplot(2,2,3);

imshow(A2);

title('映射之后的图像');


3.2 直方图均衡化
3.2.1 imhist函数/histeq函数
示例:

严格一点来说,直方图均衡化和直方图规定化是不同的概念。histeq是用来做直方图均衡的。

 直方图均衡化:Image1 = histeq(Image, hgram);

hgram是均衡化后的灰度级个数。

比如histeq(I, 16),就是希望均衡化后的直方图只有16个灰度级;

histeq(I, 64),就是希望均衡化后的直方图只有64个灰度级。

 

假设原始图像为256级,共有X个像素,现希望均衡化为N个灰度级,过程如下:

步骤1:计算原始图像I的累积函数A(g),其中g=[0,255]表示256个灰度级。

A(0)就是灰度级为0的元素个数;

A(1)就是灰度级为01的元素个数和;

A(2)就是灰度级为012的元素个数和;

...依次类推...

A(255)就是X,即原始图像的总的像素个数。

 

步骤2:计算原始直方图和均衡化后直方图的映射关系g->G,即将原始图像中的灰度值g变成新的灰度值G

这里,G=N*A(g)/X

 

步骤3:遍历原始图像I,依据步骤2中的映射关系,把所有像素点的灰度值变成新的灰度值,完毕。

 

显示直方图:

clc;

clear;

 

A = imread('flower_gray.jpg');

subplot(2,2,1);

imshow(A);

title('原图像');

 

subplot(2,2,2);

imhist(A);

title('原图像灰度直方图');

 

获取直方图和直方图均衡化:

 

clc;

clear;

 

A = imread('flower_gray.jpg');

subplot(2,2,1);

imshow(A);

title('原图像');

 

h = imhist(A);

v = h(1:10:256);

horz = 1:10:256;

subplot(2,2,2);

bar(horz, v);

axis([0 255 0 15000]);

set(gca,'xtick',[0:50:255]);

set(gca,'ytick',[0:2000:15000]);

title('原图像灰度直方图');

 

A1 =histeq(A, 256);

subplot(2,2,3);

imshow(A1);

title('直方图均衡化后的图像');

 

h1 = imhist(A1);

v1 =h1(1:10:256);

horz1= 1:10:256;

subplot(2,2,4);

bar(horz1,v1);

axis([0 255 0 15000]);

set(gca,'xtick',[0:50:255]);

set(gca,'ytick',[0:2000:15000]);

title('均衡化后的直方图');


3.2.2 自定义函数实现直方图均衡化

示例:

clc;

clear;

 

RGB = imread('flower_rgb.jpg'); %读取彩色图

subplot(1,3,1);

imshow(RGB);

title('彩色图');

 

I=rgb2gray(RGB); % 将彩色图转化为灰度图

subplot(1,3,2);

imshow(I);

title('灰度图');

 

[R, C] = size(I);

 

% 统计每个像素值出现次数

cnt = zeros(1, 256);

for i = 1 : R

   for j = 1 : C

       cnt(1, I(i, j) + 1) = cnt(1, I(i, j) + 1) + 1;

   end

end

 

f = zeros(1, 256);

f = double(f); cnt = double(cnt);

 

% 统计每个像素值出现的概率,得到概率直方图

for i = 1 : 256

   f(1, i) = cnt(1, i) / (R * C);

end

 

% 求累计概率,得到累计直方图

for i = 2 : 256

   f(1, i) = f(1, i - 1) + f(1, i);

end

 

% f数组实现像素值[0, 255]的映射。

for i = 1 : 256

   f(1, i) = f(1, i) * 255;

end

 

% 完成每个像素点的映射

I = double(I);

for i = 1 : R

   for j = 1 : C

       I(i, j) = f(1, I(i, j) + 1);

   end

end

 

% 输出

I = uint8(I);

subplot(1,3,3);

imshow(I);

title('直方图均衡化');

0 0
原创粉丝点击