分享一下最近学习的图像分类方面知识,整体的思路如下(之前的汇报ppt里截的)
把这个过程拆分几个部分共同学习一下吧
1.Otsu法原理
最大类间方差法OTSU是一种自适应的全局阈值确定的方法,根据灰度阈值T将图像分成背景和目标两部分,像素点数占比为ω_0和ω_1,平均灰度值为μ_0和μ_1
由已知,
图像平均灰度
类间方差
代入式(2-1)、(2-2)可得目标函数为
背景和目标之间的类间方差最大时,目标和背景的错分概率最小
2.原始Otsu算法与改进算法的实现
改进算法思想是在原始Otsu算法基础上求取最大类间、类内方差比值最小的情况。
在分割之前利用了一些灰度变换的方法做图像的预处理,详细内容可以看链接
% 原始的与改进的OTSU算法
clc,clear,close all
f = imread('C:\Users\HS\Desktop\duck.jpg');
f = rgb2gray(f);f1 = f;
figure,imshow(f);title('原图的灰度化');
set(gcf,'color','w');set(gca,'linewidth',1,'fontsize',16);
figure,histogram(f);title('原图的灰度直方图');
set(gcf,'color','w');set(gca,'linewidth',1,'fontsize',16);
g = imadjust(f,[0.1,0.85],[],0.5);%mamma<1时,变换凸显高灰度区域
ng = imnoise(g,'gaussian',0,0.1);
[frest,psnr] = get_winer(g,ng); % 维纳滤波
figure();imshow(frest); title(['维纳滤波去噪,PSNR=',num2str(psnr)]);
set(gcf,'color','w');set(gca,'linewidth',1,'fontsize',16);
figure,histogram(frest);title('0.1高斯噪声滤波后的灰度直方图');
axis([0,255,0,7000]);
set(gca,'xtick',0:50:255);
set(gca,'ytick',0:1000:7000);
set(gcf,'color','w');set(gca,'linewidth',1,'fontsize',16);
%% 正式开始:传统的OTSU算法
[thresh,SM] = graythresh(frest); % OTSU算法,自适应选取二值化阈值
BWimg = im2bw(frest,thresh);%im2bw的结果是白底黑目标
figure;
imshow(BWimg);title('OTSU算法二值化结果');
set(gcf,'color','w');set(gca,'linewidth',1,'fontsize',16);
figure,histogram(BWimg);title('OTSU算法二值化结果的灰度直方图');
set(gcf,'color','w');set(gca,'linewidth',1,'fontsize',16);
%% 最大类间、类内比值法
[m,n] = size(f);
th = zeros(1,254); % 准备存放比值
f = double(f); % 必须转换成double格式!!!!否则不能计算像素!!!
% fi = 0;
% for i=1:m
% for j=1:n
% fprintf('fi=%d,',fi);
% fprintf('f(%d,%d)=%d\n',i,j,f(i,j));
% fi = fi+f(i,j)