[已解决] MATLAB小白,请帮我看看怎么改

[复制链接]
寒江雪cxl 发表于 2018-4-1 09:11:25



最佳答案


matlabzhanghu 发表于 2018-4-2 11:46:11
本身代码没什么问题,你将下面的代码段存为 duhe.m 文件

  1. function dx = duhe(t,x)

  2. a = 1;  b = 2;
  3. s = sqrt(x(1)^2 + x(2)^2);    % 这里可以改成  s = norm(x);  更简洁
  4. dx = [a-b*x(1)/s;-b*x(2)/s];

  5. end
复制代码


然后在命令行运行下面的代码

  1. ts = 0:0.5:7;
  2. x0 = [0;10];
  3. [t,x] = ode45(@duhe,ts,x0);
  4. [t,x]
复制代码

5 条回复


matlabzhanghu 发表于 2018-4-1 12:09:01
你的帖子没有正确显示,请重新编辑

matlabzhanghu 发表于 2018-4-2 11:46:11
本身代码没什么问题,你将下面的代码段存为 duhe.m 文件

  1. function dx = duhe(t,x)

  2. a = 1;  b = 2;
  3. s = sqrt(x(1)^2 + x(2)^2);    % 这里可以改成  s = norm(x);  更简洁
  4. dx = [a-b*x(1)/s;-b*x(2)/s];

  5. end
复制代码


然后在命令行运行下面的代码

  1. ts = 0:0.5:7;
  2. x0 = [0;10];
  3. [t,x] = ode45(@duhe,ts,x0);
  4. [t,x]
复制代码
回复此楼

寒江雪cxl 发表于 2018-4-4 09:44:02
可以加一下你的联系方式吗?有些问题问比较方便!

matlabzhanghu 发表于 2018-4-4 10:22:41
寒江雪cxl 发表于 2018-4-4 09:44
可以加一下你的联系方式吗?有些问题问比较方便!

有问题在论坛发帖就可以了,这里牛人很多的。他们看到会回复你的。

另外,请你了解下这个帖子:你知道如何正确提问么?请使用“最短代码-错误重现”方式,他会使你更好的获得帮助。
希望你能在这里收获,在这里成长!

寒江雪cxl 发表于 2018-4-4 20:02:20
matlabzhanghu 发表于 2018-4-4 10:22
有问题在论坛发帖就可以了,这里牛人很多的。他们看到会回复你的。

另外,请你了解下这个帖子:你知道如 ...

I=imread('blood.jpg');     % 读入处理图像
R=I(:,:,1);          % 分离R分量
G=I(:,:,2);
B=I(:,:,3);
clc;                 % 清屏
close all;           % 关闭图像窗口
figure,              % 开辟图像显示窗口
subplot(2,3,1),imshow(R),title('R分量');
subplot(2,3,2),imshow(G),title('G分量');
subplot(2,3,3),imshow(B),title('B分量');
K=rgb2hsv(I);               % RGB图像转换成HSV图像
H=K(:,:,1);
S=K(:,:,2);
V=K(:,:,3);
subplot(2,3,4),imshow(H),title('H分量');
subplot(2,3,5),imshow(S),title('S分量');
subplot(2,3,6),imshow(V),title('V分量');


%****************************** 白细胞计数 ******************************%
% 分割出只有白细胞的二值图像  
[cenwhite,copywhite]=Kmeans(H,3);       % K均值聚类函数调用        
cenwhite;                       % 查看聚类后的中心值
figure,
subplot(1,3,1),imshow(copywhite,[ ]),title('H分量K均值聚类结果');
A=copywhite;
[m,n]=size(A);            % 把聚类后图像二值化
for i=1:m
    for j=1:n
        if A(i,j)==cenwhite(2)
           A(i,j)=1;
        else A(i,j)=0;
        end
    end
end
subplot(1,3,2),imshow(A,[ ]),title('白细胞二值化结果');
C1=imdilate(A,ones(5));          % 对二值化图像腐蚀膨胀处理达到去噪效果
%分水岭算法存在过去噪问题
C2=imerode(C1,ones(11));
C=imdilate(C2,ones(6));
subplot(1,3,3),imshow(C,[ ]),title('白细胞去噪结果');

% 下面两种方法中任选一种作为白细胞计数输出
% 方法一用4连通分割图像计算白细胞个数 %
L4=bwlabel(C,4);                 % 4连通运算
figure,subplot(1,2,1),imshow(L4,[ ]),title('法一白细胞4连通结果');
Numwhite=max(max(L4));           % 计算4连通后图像中的最大值即为白细胞个数
Numwhite;                         % Numwhite为4连通计数结果显示结果

% 方法二用分水岭算法分割图像计算白细胞个数 %
E=bwdist(~C);
E=-E;
E(~C)=-Inf;
L0=watershed(E);
rgb=label2rgb(L0,'jet');
subplot(1,2,2),imshow(rgb,[ ]),title('法二白细胞分水岭结果');
NumWhite=max(max(L0))-1;               
NumWhite;                     % NumWhite为分水岭算法计数结果显示结果


%****************************** 红细胞计数 ******************************%
% 分割出只有红细胞的二值图像并对其做必需处理
I1(:,:,1)=double(I(:,:,1)).*C;        % 把二值图像还原为彩色图像
I1(:,:,2)=double(I(:,:,2)).*C;
I1(:,:,3)=double(I(:,:,3)).*C;
figure,subplot(1,2,1),imshow(uint8(I1)),title('白细胞');
J=double(I)-double(I1);               % 原图减去白细胞图得红细胞彩图  
subplot(1,2,2),imshow(uint8(J)),title('红细胞');
J=rgb2hsv(J);                         % 红细胞图转换成HSV图
HH=J(:,:,1);
SS=J(:,:,2);                          % 提取S分量
VV=J(:,:,3);
subplot(1,3,1),imshow(HH),title('红细胞图H分量');
subplot(1,3,2),imshow(SS),title('红细胞图S分量');
subplot(1,3,3),imshow(VV),title('红细胞图V分量');
[cenred,copyred]=Kmeans(SS,2);            % 对S分量图均值聚类
cenred;                        % 查看聚类后的中心值
figure,subplot(2,2,1),imshow(copyred,[ ]),title('S分量K均值聚类结果');
H=copyred;
[m,n]=size(H);              % 把聚类后图像二值化
for i=1:m
    for j=1:n
        if H(i,j)==cenred(2)
           H(i,j)=1;
        else H(i,j)=0;
        end
    end
end
subplot(2,2,2),imshow(H,[ ]),title('红细胞二值化结果');
G=imfill(H,'holes');         % 红细胞图填充孔洞
subplot(2,2,3),imshow(G,[ ]),title('红细胞填洞结果');
C1=imerode(G,ones(9));       % 开运算去除噪声
G=imdilate(C1,ones(9));
subplot(2,2,4),imshow(G,[ ]),title('红细胞去噪结果');

% 方法一通过判断面积大小计算红细胞个数 %
[J,num]=bwlabel(G,8);        % 8连通运算保存区域个数num
figure,subplot(1,2,1),imshow(J,[ ]),title('红细胞8连通结果');
sum=0;            % 定义sum为总面积变量
numred1=0;          % 定义numred1为红细胞个数变量
for i=1:num
    [J1,J2]=find(J==i);    % 找出J中值为i的像素坐标分别存入J1,J2中
    area(i)=length(J1);    % area(i)为第i个红细胞的面积
    sum=sum+area(i);       % 面积累加
end  
ave=sum/num;           % 求红细胞的平均面积ave
for i=1:num            % 通过面积比较判断个数的增加值
    if 0.5*ave<area(i) && area(i)<=1.5*ave
        numred1=numred1+1;    % 如果细胞区域的面积在0.51.5倍之间视为一个细胞
    end
    if 1.5*ave<area(i) && area(i)<=2.5*ave
        numred1=numred1+2;     % 如果细胞区域的面积在1.52.5倍之间视为两个细胞
    end
    if 2.5*ave<area(i) && area(i)<=3.5*ave
        numred1=numred1+3;     % 如果细胞区域的面积在2.53.5倍之间视为三个细胞
    end
end
numred1;               % 查看面积法得到的红细胞个数numred1

% 方法二用分水岭算法计算红细胞的个数 %
D=bwdist(~G);
D=-D;
D(~G)=-Inf;
L=watershed(D);
rgb=label2rgb(L,'jet');
subplot(1,2,2),imshow(rgb,[ ]),title('红细胞分水岭算法结果');
numred2=max(max(L))-1;
numred2;            % 查看分水岭算法得到的红细胞个数numred2

% 为缩小误差把两种方法得出的红细胞个数的平均值作为红细胞的最终个数 %
NumRed=floor((numred1+numred2)/2);                % floor()为向上取整。相关函数有ceil()向上取整,round()四舍五入。
NumRed;         % 查看最终得到的红细胞个数NumRed 程序运行结果    运行结果少了最终结果图,能帮我看看吗?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
热门教程
站长推荐
快速回复 返回顶部 返回列表