特征提取与图像处理:简单基本的图像处理运算

概念

        直方图:亮度直方图表示每个亮度级在图像中的占有率,图像对比度是通过亮度级范围来度量的,而直方图所示的是特定亮度级像素点的数目。

        直方图拉伸和直方图均衡化是两种常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而扩大前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。

直方图正规化

         直方图正规化(histogram normalization)是常见的扩展亮度级的方法,将原直方图进行扩展和位移,使直方图涵盖所有256个亮度级。

         matlab代码实现:

function normalization()
close all;
clear all;
clc;
I = imread('3.jpg');
set(gcf, 'outerposition', get(0, 'screensize'));
grayI = rgb2gray(I);
subplot(221);
imshow(grayI, []);
title('原始灰度图像');

%原始灰度图像直方图
subplot(222);
imhist(grayI, 255);
title('直方图');

%直方图正规化
grayI = double(grayI);
[rows, cols] = size(grayI);
minim = min(min(grayI));
range = max(max(grayI)) - minim;
range = double(range);

for x = 1 : rows
    for y = 1 : cols
        grayI(x,y) = floor(((grayI(x,y)-minim)*255)/range);
    end
end

%直方图正规化后的图像
subplot(223);
imshow(grayI, []);
title('正规化灰度图像');

%正规化后的直方图
subplot(224);
imhist(uint8(grayI), 255);
title('正规化直方图');

        效果图如下:

直方图均衡化

        直方图均衡化是一个非线性处理过程,映射函数满足单调递增,且存在上下确界,增强局部对比。

        matlab代码实现:

function equalization()
close all;
clear all;
clc;
I = imread('2.jpg');
set(gcf, 'outerposition', get(0, 'screensize'));
grayI = rgb2gray(I);
subplot(221);
imshow(grayI, []);
title('原始灰度图像');

%原始灰度图直方图
subplot(222);
imhist(grayI, 225);
title('原始灰度图直方图');

dict = zeros(256, 1);
[rows, cols] = size(grayI);
for i = 1 : rows
    for j = 1 : cols
        dict(grayI(i, j) + 1, 1) = dict(grayI(i, j) + 1, 1) + 1;
    end
end

sum = 0;
for k = 0 : 255
    sum = sum + dict(k + 1, 1);
    dict(k + 1, 1) = floor((sum*255)/(rows*cols)+0.000001);
end

for m = 1 : rows
    for n = 1 : cols
        grayI(m, n) = dict(grayI(m, n) + 1, 1);
    end
end

subplot(223);
imshow(grayI);
title('均衡化后的灰度图像');

%均衡化后的直方图
subplot(224);
imhist(grayI, 255);
title('均衡化后的直方图');

end

        效果图如下:


阈值处理

        ostu阈值处理图像二值化问题,通过定义类间差来选择最优的阈值。类间差用来表征阈值左右两个区域间灰度值差别程度,差别程度越大,说明边界部分大致分到了一边,非边界被分到另一边。

        matlab实现代码:

function Otsu()
close all
clear all
clc
I = imread('1.jpg');
set(gcf, 'outerposition', get(0, 'screensize'));
I = rgb2gray(I);
subplot(121);
imshow(I);
title('原始图像');

[rows, cols] = size(I);
dict = zeros(256, 1);
prob = zeros(256, 1);
mean = 0;
mean1 = zeros(256, 1);
mean2 = zeros(256, 1);

for i = 1 : rows
    for j = 1 : cols
        dict(I(i,j) + 1, 1) = dict(I(i,j) + 1, 1) + 1;
    end
end

prob(1) = dict(1, 1)/rows/cols + 0.00000001;
for k = 2 : 256
    prob(k, 1) = prob(k-1) + dict(k, 1)/rows/cols;
end

for m = 1 : 256
    mean = mean + dict(m, 1) * (m - 1);
end
mean = mean/rows/cols + 0.0000001;

mean1(1, 1) = 0.00000001;
mean2(1, 1) = mean; 
for n = 2 : 256
    mean1(n, 1) = mean1(n-1, 1) * dict(n-1, 1) + dict(n, 1) * (n - 1);
    dict(n, 1) = dict(n, 1) + dict(n-1, 1);
    if(dict(n, 1) > 0)
        mean1(n, 1) = mean1(n, 1)/dict(n, 1);
        mean2(n, 1) = mean - mean1(n, 1);
    else
        mean1(n, 1) = 0.00000001;
        mean2(n, 1) = mean;
    end
end

sigma = 0;
threshold = 0;
for s = 1 : 256
    if(prob(s, 1) * (1-prob(s, 1)) * (mean1(s, 1)-mean2(s, 1)) * (mean1(s, 1)-mean2(s, 1)) > sigma)
        threshold = s - 1;
        sigma = prob(s, 1) * (1-prob(s, 1)) * (mean1(s, 1)-mean2(s, 1)) * (mean1(s, 1)-mean2(s, 1));
    end
end

for r = 1 : rows
    for c = 1 : cols
        if(I(r,c) >= threshold)
            I(r,c) = 255;
        else
            I(r,c) = 0;
        end
    end
end

subplot(122);
imshow(I);
title('二值图像');

        效果图如下:



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值