用matlab求图像阈值分析程序,急啊~

用matlab求图像阈值分析程序,急啊~,第1张

我给你提供2种方法,一种是直方图阈值法一种是最大类间方差

直方图阈值法

用 MATLAB实现直方图阈值法:

I=imread(' c4jpg ');

I1=rgb2gray(I);

figure;

subplot(2,2,1);

imshow(I1);

title(' 灰度图像')

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图像处理的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10125118.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存