我给你提供2种方法,一种是直方图阈值法一种是最大类间方差
直方图阈值法
用 MATLAB实现直方图阈值法:
I=imread(' c4jpg ');
I1=rgb2gray(I);
figure;
subplot(2,2,1);
imshow(I1);
axis([50,250,50,200]);
grid on; %显示网格线
axis on; %显示坐标系
[m,n]=size(I1); %测量图像尺寸参数
GP=zeros(1,256); %预创建存放灰度出现概率的向量
for k=0:255
GP(k+1)=length(find(I1==k))/(mn); %计算每级灰度出现的概率,将其存入GP中相应位置
end
subplot(2,2,2),bar(0:255,GP,'g') %绘制直方图
title('灰度直方图')
xlabel('灰度值')
ylabel(' 出现概率')
I2=im2bw(I,150/255);
subplot(2,2,3),imshow(I2);
title('阈值150的分割图像')
axis([50,250,50,200]);
grid on; %显示网格线
axis on; %显示坐标系
I3=im2bw(I,200/255); %
subplot(2,2,4),imshow(I3);
title('阈值200的分割图像')
axis([50,250,50,200]);
grid on; %显示网格线
axis on; %显示坐标系
自动阈值法:Otsu法
用MATLAB实现Otsu算法:
clc
clear all
I=imread(' c4jpg ');
subplot(1,2,1),imshow(I);
title('原始图像')
axis([50,250,50,200]);
grid on; %显示网格线
axis on; %显示坐标系
level=graythresh(I); %确定灰度阈值
BW=im2bw(I,level);
subplot(1,2,2),imshow(BW);
title('Otsu 法阈值分割图像')
axis([50,250,50,200]);
grid on; %显示网格线
axis on; %显示坐标系
窗函数设计低通滤波器:
fp=1000;
fc=1200;
as=100;
ap=1;
fs=22000;
wp=2fp/fs;
wc=2fc/fs;
N=ceil((as-795)/(1436(wc-wp)/2))+1;
beta=01102(as-87);
window=Kaiser(N+1,beta);
b=fir1(N,wc,window);
freqz(b,1,512,fs);
结果:
高通滤波器:
fs=22000;
Wp=25000/fs;
Ws=24800/fs;
Ap=1;
As=100;
N=ceil(8pi/(Wp-Ws))+1;
N=N+mod(N+1,2)+1;
Wc=(Wp+Ws)/2/pi;
h=fir1(N,Wc,'high');
omega=linspace(0,pi,512);
freqz(h,1,omega);
结果:
带通滤波器:
fs=22000;
Wp1=21200/fs;
Wp2=23000/fs;
Wc1=21000/fs;
Wc2=23200/fs;
Ap=1;
As=100;
W1=(Wp1+Wc1)/2;
W2=(Wp2+Wc2)/2;
wdth=min((Wp1-Wc1),(Wc2-Wp2));
N=ceil(11pi/wdth)+1;
b = fir1(N,[W1 W2]);
freqz(b,1,512,fs)
结果:
双线性法设计低通滤波器:
fp=1000;
fc=1200;
as=100;
ap=1;
fs=22000;
wp=2fp/fs;
wc=2fc/fs; %归一化截止频率
[n,wn]=ellipord(wp,wc,ap,as);%求数字滤波器的最小阶数和归一化截止频率
[b,a]=ellip(n,ap,as,wn);%求传递函数的分子分母系数
freqz(b,a,512,fs);
结果:
滤波:
d=filter(b,a,y);
X=0; %清空X
map=0;
[X,map]=imread('lena256x256x8bmp'); %读取图像
p=imfinfo('lena256x256x8bmp'); %读取图像的属性
s=2^pBitDepth-1; %计算图像的最大深度,如8位图像为255
%-------------------------------------------------------------------------
%简化的图像增强算法:简化Pmn及T变换的算法为:
Y=0; %清空Y
A=0;%清空A
Y=double(X)/s; %计算P(m,n),相当于求G(x)
%模糊变换算法
for m=1:pHeight
for n=1:pWidth
if(Y(m,n)<05)
A(m,n)=2Y(m,n)^2;
else
A(m,n)=1-2(1-Y(m,n))^2;
end
end
end
B=0; %清空B
B=uint8(A(2^pBitDepth-1)); %相当于求逆G-1(x')
%%%区域减影增强算法
P=0; %清空P
d=000005;%%%%设定冗余度
k=2;%%%%设定修正参数
for m=1:pHeight
for n=1:pWidth
if(Y(m,n)-A(m,n)>d)
P(m,n)=Y(m,n)+k(Y(m,n)-A(m,n));
end
if(Y(m,n)-A(m,n)<(-d))
P(m,n)=Y(m,n)+(-k)(Y(m,n)-A(m,n));
else
P(m,n)=Y(m,n);
end
end
end
B=0; %清空B
B=uint8(P(2^pBitDepth-1)); %相当于求逆G-1(x')
%%%图像增强几种方法效果对比
I=imread('lena256x256x8bmp'); %读入图像
I=double(I); %变成双精度
K1=filter2(fspecial('average',5),I)/255; %进行滤波
K2=imsubtract(I,K1);
K2=immultiply(K2,05);
K3=imadd(I,K2);
K2=uint8(K2); %转成8位数据
K3=uint8(K3);
I=uint8(I);
figure
title('图像增强几种方法效果对比');
subplot(2,2,1);imshow(I);title('原始图像');
subplot(2,2,2);imshow(K1);title('低通滤波图像');
subplot(2,2,3);imshow(K3);title('线性反锐化掩膜图像');
subplot(2,2,4);imshow(B);title('区域减影增强图像');
matlab提供了现成的函数
graycomatrix生成共生矩阵
graycoprops计算其特征值
具体用法:
glcm = graycomatrix(I)
从图像I创建灰度共生矩阵glcm。通过计算具有灰度级i和灰度级j的像素对在水平方向相邻出现的频繁程度。glcm中的每个元素说明了水平方向相邻像素对出现的次数。如果灰度级为L则glcm的维数为LL。
2glcms = graycomatrix(I,param1,val1,param2,val2,)
根据参数对的设定,返回一个或多个灰度共生矩阵。
参数说明:
'GrayLimits':灰度界限,为二元向量[low high]。灰度值小于等于low 时对应1,大于等于high时对应于灰度级。如果参数设为[],则共生矩阵使用图像的最小和最大灰度值作为界限,即[min(I(:)) max(I(:))]。
'NumLevels':整数,说明I中进行灰度缩放的灰度级数目。例如,如果NumLevel设为8,则共生矩阵缩放I中的灰度值使它们为1到8之间的整数。灰度级的数目决定了共生矩阵glcm的尺寸。缺省情况:数字图像:8;二进制图像:2。
'Offset':p行2列整型矩阵,说明感兴趣像素与其相邻像素之间的距离。每行是一个说明像素对之间偏移关系的二元向量[row_offset, col_offset]。行偏移row_offset是感兴趣像素和其相邻像素之间的间隔行数。列偏移同理。偏移常表达为一个角度,常用的角度如下:(其中D为像素距离)
角度 0 45 90 135
Offset [0,D] [-D D] [-D 0] [-D -D]
3[glcms,SI] = graycomatrix()
返回缩放图像SI,SI是用来计算灰度共生矩阵的。SI中的元素值介于1和灰度级数目之间。
graycoprops:得到灰度共生矩阵得到各种属性
stats = graycoprops(glcm, properties):从灰度共生矩阵glcm计算静态属性。glcm是mnp的有效灰度共生矩阵。如果glcm是一个灰度共生矩阵的矩阵,则stats是包括每个灰度共生矩阵静态属性的矩阵。
graycoprops正规化了灰度共生矩阵,因此元素之和为1。正规化的GLCM中的元素(r,c)是具有灰度级r和c的定义的空间关系的像素对的联合概率。Graycoprops使用正规化的GLCM来计算属性。
属性参数如下:
1 'Contrast' : 对比度。返回整幅图像中像素和它相邻像素之间的亮度反差。取值范围:[0,(GLCM行数-1)^2]。灰度一致的图像,对比度为0。
2 'Correlation' : 相关。返回整幅图像中像素与其相邻像素是如何相关的度量值。取值范围:[-1,1]。灰度一致的图像,相关性为NaN。
3 'Energy' : 能量。返回GLCM中元素的平方和。取值范围:[0 1]。灰度一致的图像能量为1。
4 'Homogemeity' : 同质性。返回度量GLCM中元素的分布到对角线紧密程度。取值范围:[0 1]。对角矩阵的同质性为1。
是这样的,如果你再程序开始添加holdon这个的画,表示这之后的每一次作图都保留以前的图,这样就可以连续画图了
反之holdoff,表示打开这个之后,每次画图,删除以前的图,
%
% 图像检索——纹理特征
%基于共生矩阵纹理特征提取,d=1,θ=0°,45°,90°,135°共四个矩阵
%所用图像灰度级均为256
%参考《基于颜色空间和纹理特征的图像检索》
%function : T=Texture(Image)
%Image : 输入图像数据
%T : 返回八维纹理特征行向量
%
function T = Texture(path)
Image = imread(path);
% [M,N,O] = size(Image);
M = 256;
N = 256;
if isrgb(Image)%判断是否是RGB
Gray=rgb2gray(Image);
end
%--------------------------------------------------------------------------
%1将各颜色分量转化为灰度
%--------------------------------------------------------------------------
%Gray = double(03Image(:,:,1)+059Image(:,:,2)+011Image(:,:,3))
%--------------------------------------------------------------------------
%2为了减少计算量,对原始图像灰度级压缩,将Gray量化成16级
%--------------------------------------------------------------------------
for i = 1:M
for j = 1:N
for n = 1:256/16
if (n-1)16<=Gray(i,j)&Gray(i,j)<=(n-1)16+15
Gray(i,j) = n-1;
end
end
end
end
%--------------------------------------------------------------------------
%3计算四个共生矩阵P,取距离为1,角度分别为0,45,90,135
%--------------------------------------------------------------------------
P = zeros(16,16,4);
for m = 1:16
for n = 1:16
for i = 1:M
for j = 1:N
if j
P(m,n,1) = P(m,n,1)+1;
P(n,m,1) = P(m,n,1);
end
if i>1&j
P(m,n,2) = P(m,n,2)+1;
P(n,m,2) = P(m,n,2);
end
if i
P(m,n,3) = P(m,n,3)+1;
P(n,m,3) = P(m,n,3);
end
if i
P(m,n,4) = P(m,n,4)+1;
P(n,m,4) = P(m,n,4);
end
end
end
if m==n
P(m,n,:) = P(m,n,:)2;
end
end
end
%%---------------------------------------------------------
% 对共生矩阵归一化
%%---------------------------------------------------------
for n = 1:4
P(:,:,n) = P(:,:,n)/sum(sum(P(:,:,n)));
end
%--------------------------------------------------------------------------
%4对共生矩阵计算能量、熵、惯性矩、相关4个纹理参数
%--------------------------------------------------------------------------
H = zeros(1,4);
I = H;
Ux = H; Uy = H;
deltaX= H; deltaY = H;
C =H;
for n = 1:4
E(n) = sum(sum(P(:,:,n)^2)); %%能量
for i = 1:16
for j = 1:16
if P(i,j,n)~=0
H(n) = -P(i,j,n)log(P(i,j,n))+H(n); %%熵
end
I(n) = (i-j)^2P(i,j,n)+I(n); %%惯性矩
Ux(n) = iP(i,j,n)+Ux(n); %相关性中μx
Uy(n) = jP(i,j,n)+Uy(n); %相关性中μy
end
end
end
for n = 1:4
for i = 1:16
for j = 1:16
deltaX(n) = (i-Ux(n))^2P(i,j,n)+deltaX(n); %相关性中σx
deltaY(n) = (j-Uy(n))^2P(i,j,n)+deltaY(n); %相关性中σy
C(n) = ijP(i,j,n)+C(n);
end
end
C(n) = (C(n)-Ux(n)Uy(n))/deltaX(n)/deltaY(n); %相关性
end
%--------------------------------------------------------------------------
%求能量、熵、惯性矩、相关的均值和标准差作为最终8维纹理特征
%--------------------------------------------------------------------------
T(1) = mean(E); T(2) = sqrt(cov(E));
T(3) = mean(H); T(4) = sqrt(cov(H));
T(5) = mean(I); T(6) = sqrt(cov(I));
T(7) = mean(C); T(8) = sqrt(cov(C));
看下这个程序function main()
%主要思想是从两幅图像中选取信息,然后置乱成一幅图像。
%这样可以从要加密的多幅(2n幅)图像中,按照上述思想,得到一半数目(n幅)的图像。
%对得到的图像进行自适应算法的隐藏,又可以得到(n-1)幅的图像。
%对(n-1)幅的图像进行Arnold变换,得到(n-1)幅的图像作为密钥,此外,密钥还有迭代次数,置乱规则,Arnold加密规则
%主要缺点是Arnold的周期较大,程序的运行的时间长些,我的电脑需要8分钟,另外,Arnold只能处理方阵
%图像的置乱加密算法很多,本程序中用到的置乱加密算法只是其中一种方法,仅仅提出一个多幅图像加密的思想,后期还有许多的工作要做。
%读入四幅图像
F1 = imread('lenagif');
F2 = imread('monkeygif');
F3 = imread('housegif');
F4 = imread('cameramangif');
%对图像的置乱
pic1_zhiluan = zhiluan(F1,F2);
pic2_zhiluan = zhiluan(F3,F4);
%显示置乱后的图像
pic1_zhiluan = uint8(pic1_zhiluan);
figure,imshow(pic1_zhiluan),title('pic1 zhiluan')
pic2_zhiluan = uint8(pic2_zhiluan);
figure,imshow(pic2_zhiluan),title('pic2 zhiluan')
%将两幅置乱图像进行隐藏
X1 = input('请输入一个混合迭代参数:');
pic1_hide = hide(pic1_zhiluan,X1,pic2_zhiluan);
%对隐藏后的图像进行Arnold置乱加密
diedai1 = input('请输入一个迭代的参数:')
pic1_jiami = Arnold(pic1_hide,diedai1,0);
%显示加密后的图像
pic1_jiami = uint8(pic1_jiami);
figure,imshow(pic1_jiami),title('pic1 jiami')
diedai2 = input('请输入一个迭代的参数:')
pic2_jiami = Arnold(pic2_zhiluan,diedai2,0);
pic2_jiami = uint8(pic2_jiami);
figure,imshow(pic2_jiami),title('pic2 jiami')
%解密图像
pic1_jiemi = Arnold(pic1_jiami,diedai1,1);
pic2_jiemi = Arnold(pic2_jiami,diedai2,1);
%恢复隐藏后的图像
pic1_huifu = huifu(pic1_jiemi,X1,pic2_jiemi);
%置乱的逆处理,得到恢复后的图像
[image1,image2] = ni_zhiluan(pic1_huifu);
[image3,image4] = ni_zhiluan(pic2_jiemi);
%显示各个图像
F1 = uint8(F1);
figure,imshow(F1),title('F1');
figure,imhist(F1),title('F1的直方图');
image1 = uint8(image1);
figure,imshow(image1),title('image1');
figure,imhist(image1),title('image1的直方图');
F2 = uint8(F2);
figure,imshow(F2),title('F2');
figure,imhist(F2),title('F2的直方图');
image2 = uint8(image2);
figure,imshow(image2),title('image2');
figure,imhist(image2),title('image2的直方图');
F3 = uint8(F3);
figure,imshow(F3),title('F3');
figure,imhist(F3),title('F3的直方图');
image3 = uint8(image3);
figure,imshow(image3),title('image3');
figure,imhist(image3),title('image3的直方图');
F4 = uint8(F4);
figure,imshow(F4),title('F4');
figure,imhist(F4),title('F4的直方图');
image4 = uint8(image4);
figure,imshow(image4),title('image4');
figure,imhist(image4),title('image4的直方图'
以上就是关于用matlab求图像阈值分析程序,急啊~全部的内容,包括:用matlab求图像阈值分析程序,急啊~、MATLAB数字图像处理程序、求救!帮忙看一段MATLAB图像处理的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)