我的MATLAB积分程序出现错误To RESHAPE the number of elements must not change. 求大神指点,怎么改啊?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我的MATLAB积分程序出现错误To RESHAPE the number of elements must not change. 求大神指点,怎么改啊?相关的知识,希望对你有一定的参考价值。

clc
clear
syms n T L1 L2 S1 S2 S3 S4 S5 S6 S7 S8 S9 S10
%(L1为L,L2为L一撇)
m=[n,15*n,2.564*n,3*n,24.3*n,6*n];
U1=[0.002152*sqrt(L1),1.3*sqrt(L1),1.224*sqrt(L1),0.5896*sqrt(L1),1.1465*sqrt(L1),1.1465*sqrt(L1)];
%(L1)(行星架,太阳轮,行星轮,内齿圈,齿轮g3,齿轮g4)
U2=[0.002152*sqrt(L2),1.3*sqrt(L2),1.224*sqrt(L2),0.5896*sqrt(L2),1.1465*sqrt(L2),1.1465*sqrt(L2)];%(L2)
M=[4.73,6.54,5.46,5.46,6.25,5.46];
C=[2.58e15,2.8e21,2.54e18,2.4e18,4.26e20,8.3e18];
S0=[650,1400,1400,1080,1400,1400];
SM=S0-((S0-(S0.*(U2-U1)./(S0-U1))).*log(1-m.*((S0.*(U2-U1)./(S0-U1)).^M)./C))./(log(C)-M.*log((S0.*(U2-U1))./(S0-U1)));
%以上是强度退化规律
Smu=[SM(1),656.12,SM(2),SM(3),SM(4),598.16,260.65,656.12,SM(5),SM(6)];
Ssigma=[0.03*SM(1),26.2448,0.04*SM(2),0.04*SM(3),0.03*SM(4),23.9264,10.426,26.2448,0.04*SM(5),0.04*SM(6)];
fSmu=log(Smu)-0.5.*log((Ssigma./Smu).^2+1);
fSsigma=sqrt(log((Ssigma./Smu).^2+1));
S=[S1,S2,S3,S4,S5,S6,S7,S8,S9,S10];
fS=(1./(S.*fSsigma.*sqrt(2*pi))).*exp((-0.5).*((log(S)-fSmu)./fSsigma).^2);
%以上是强度的概率密度函数
UT=[0.002152*sqrt(T),10.88,1.3*sqrt(T),1.224*sqrt(T),0.5896*sqrt(T),0.56*sqrt((0.225633*T+8.559522)^2+(-0.041198*T)^2)+0.117259*T-1.7176,sqrt((0.108513*T+7.600488)^2+(-0.083623*T)^2),11.77,1.1465*sqrt(T),1.1465*sqrt(T)];
%上述T和L1,L2都是以牛毫米为单位
PII=1;
for i=1:10
I1(i)=int(fS(i),S(i),UT(i),inf);
PII=PII*I1(i);
end
%求第一个积分和连乘,第二个连乘算不出来,下面就是
%PIJ=1;
%for n=1:864000
%PIJ=PIJ*PII;
%end
k=(1/(0.05*L1*sqrt(2*pi)))*exp((-0.5)*((T-L1)/0.05*L1)^2);
A=PII*k;
%maple('kernelopts(gcfreq=10000)');
I2=int(A,T,400,1400);
%以上是第二次积分,积分区域设的不对,处于试验中
g2=(1/(52.843*sqrt(2*pi)))*exp((-0.5)*((L2-1056.86)/52.843)^2);
B=I2*g2;
I3=int(B,L2,600,1600);
%以上为第三次积分,未验证
g1=(1/(44.036*sqrt(2*pi)))*exp((-0.5)*((L1-880.72)/44.036)^2);
D=I3*g1;
R=int(A,L1,400,1400)

参考技术A To RESHAPE the number of elements must not change的1.向,往,到
She lives in the house to the right.
她住在右边的房子里。
This road leads to Paris.
这条路通往巴黎。
2.(表示距离)离
3.(表示时间)直到,在...之前
He wrote from morning to night.
他从早到晚写东西。
4.(表示程度、范围)到,达
He was wet to the skin.
他浑身湿透了。
5.趋于;(变)成,(变)到
Things are going from bad to worse.
情形每况愈下。
6.(表示位置)对,面对
7.(表示接近、接触)在,于,紧贴着
8.(表示对象)对,向
Excessive drinking did harm to his health.
参考技术B 错误是意思是说:输入的维数出错 比如输入的是三维的 你把它当二维了
一定要把报错的位置贴出来吧 你的程序 没细看
不同内容 同一错误 可能不同追问

错误的位置在运行到I3=int(B,L2,600,1600);时发生的,看了很多遍,应该不存在维数问题啊~~我是初学者,肯能也看不出什么问题,可以的话帮我看看,谢了

参考技术C To RESHAPE the number of elements must not change 所包含的元素个数必须不改变
我在电脑是运行了 电脑配置不够 运行了半个小时 没有出结果 积分运算太复杂!呵呵 !追问

我运行一次也是很久,可能是我编的不够简化,新手。。

追答

PII=1;
for i=1:10
I1(i)=int(fS(i),S(i),UT(i),inf);
PII=PII*I1(i);
end
这一段代码求的是PII的值,就是这里很费时!直接给个值 比如PII=5,不能发现显式积分(可能要用到数值解),
R =
int(225179981368524800/5644425081792261/L1*exp(-1/2*(20*T-20*L1)^2*L1^2),L1 = 400 .. 1400)
下面代码没有问题!
积分问题比较复杂,不管用什么方法! 希望对你有帮助!

Matlab 肝脏图像分割

【中文标题】Matlab 肝脏图像分割【英文标题】:Matlab image segmentation for liver 【发布时间】:2016-12-14 13:18:40 【问题描述】:

我在 matlab 中的图像分割中苦苦挣扎。我的目标是从 ct 扫描图像中提取肝脏。 。

我为这个样本图像提取了肝脏,输出如下。 我的实现代码是

function [] = Code4( image_file )
image = imread(image_file);       
[height, width, planes] = size(image);
rgb = reshape(image, height, width * planes);
r = image(:, :, 1);             
g = image(:, :, 2);             
b = image(:, :, 3);             

% since r,g & b are of equeal values, we will be considering only r.

mask=r>120 & r<140 ;  % range of color component for liver
labels = bwlabel(mask);
id = labels(111, 200);

% get the mask containing only the desired object
liver = (labels == id);
imagesc(liver);
colorbar;

end

我的问题是当我改变图像时,肝脏部分的 rgb 值可能会不同。 这是其他示例图片

.

对于此图像,每个颜色分量(r、g 和 b)的 rgb 值从 160 到 190 不等。请帮我解决问题。

这是 rgb 范围从 110 到 180 的其他示例图像 .

请帮忙。

【问题讨论】:

您不能按值分割 CT 图像。它有噪音,CT值会发生变化。您需要使用一些更好的分割技术,例如水平集 @AnderBiguri 能否提供详细信息? 我会尝试在图像的一阶导数中找到轮廓,然后通过形态学操作将其放大以确保没有间隙,然后用洪水填充进行填充 也看看Fracture detection in hand using image proccessing @swapnilgandhi 不,它对 *** 来说太复杂了。您需要阅读一些论文/书籍 【参考方案1】:

不使用固定阈值,您可以尝试按灰度级对图像进行聚类。作为预处理步骤,我建议使用形态学开放来使相邻像素的灰度差异变小,从而减少聚类图像中的噪声。

下面我使用3x3 圆形内核对图像应用两个连续的形态开口,然后对灰度级应用k-means 聚类。从您的示例图像和我在互联网上找到的一些图像中,我决定设置k = 4。如果您使用的是高分辨率图像,请先将它们下采样到大约 400-600 的尺寸。否则形态学操作可能效果不明显,k-means会很慢。

以下是一些打开和分割的图像。当然还有很多事情要做

肝区分离 将其推广到大型数据集

但希望这至少是一个起点。

我没有matlab,所以代码在c++opencv,但是转换应该很简单,因为它只涉及形态和聚类操作,它应该有点类似于this。

更新 您可以通过过滤掉分割图像中最暗和最亮的区域来缩小区域或兴趣范围。为此,使用 k-means 聚类中心,检查极值(最大值和最小值)并从标记图像中删除相应的 k 值。然后您可以在结果图像的左侧查找大型结构。最坏的情况是,当极端区域过滤出错时,您可能会在左侧出现一个洞。我已经更新了代码和结果。

opencv c++ 代码

// load image as gray scale
Mat im = imread("5.jpg", 0);
// morphological opening
Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
Mat morph;
morphologyEx(im, morph, CV_MOP_OPEN, kernel, Point(-1, -1), 2);
// clustering
int k = 4;
Mat segment, lbl;
vector<float> centers;
morph.convertTo(segment, CV_32F);
int imsize[] = segment.rows, segment.cols;
Mat color = segment.reshape(1, segment.rows*segment.cols);
kmeans(color, k, lbl, TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0), k, KMEANS_PP_CENTERS, centers);
lbl = lbl.reshape(1, 2, imsize);

// find argmin and argmax to find extreme gray level regions
int minidx = min_element(centers.begin(), centers.end()) - centers.begin();
int maxidx = max_element(centers.begin(), centers.end()) - centers.begin();
// prepare a mask to filter extreme gray level regions
Mat mask = (lbl != minidx) ^ (lbl == maxidx);

// only for display purposes
Mat lbldisp;
lbl.convertTo(lbldisp, CV_8U, 255.0/(k-1));
Mat lblColor;
applyColorMap(lbldisp, lblColor, COLORMAP_JET);
// region of interest
Mat roiColor = Mat::zeros(lblColor.size(), CV_8UC3);
lblColor.copyTo(roiColor, mask);

imshow("opened", morph);
imshow("segmented", lblColor);
imshow("roi", roiColor);
waitKey();

【讨论】:

我非常想知道投反对票的原因,以便改进我的回答。 我没有投反对票,发现你的答案实际上很有趣,但这个问题对于 Stack Overflow 来说完全是题外话。这不是一个编程问题,而是一个图像处理研究项目。您的回答肯定指向正确的方向,但对离题问题的回答通常不受欢迎。 @dasdingonesin 谢谢。我只是发现这个问题很有趣,并想分享我尝试过的东西。 :)

以上是关于我的MATLAB积分程序出现错误To RESHAPE the number of elements must not change. 求大神指点,怎么改啊?的主要内容,如果未能解决你的问题,请参考以下文章

Matlab 肝脏图像分割

Matlab 蒙特卡罗积分循环

matlab中出现case语句错误

为啥 Matlab 独立应用程序退出并出现错误“TooManyOutputs”?

用matlab编写n等分的复合梯形公式和复合辛普森公式计算积分1/(1+x^2)在0到1上的积分的程序,输入参数为n,

如何用matlab求积分