找回密码
 立即注册
搜索
查看: 27749|回复: 152

[原创] [学术] 腿部曲线学:小腿曲线函数的初步研究(更新新科技

[复制链接]
     
发表于 2014-5-25 08:42 | 显示全部楼层 |阅读模式
本帖最后由 玉米黍 于 2014-5-26 11:20 编辑

起因是这一帖: [讨论] 以数学方法验证条河麻耶的脚线美的形式原理

http://bbs.saraba1st.com/2b/thread-1026428-1-2.html

个人认为日本人的验证方法过于粗糙。比如无法说明两对比图之间的比例问题。于是本着严谨的态度,利用简单的工程数据分析法对小腿曲线函数为: y=1/3*sinθ  的说法进行论证。


这里我采用南宫那月的腿部作为本次研究的对象。




首先用PS裁剪所需的腿部区域,并去掉地面的纹理方便图像处理。接着上传图片至外链网站。




用Matlab导入图片 我们得到一个319*117 的3D矩阵。 由于此图黑丝的颜色对比大,所以单选其中一个(红色)矩阵即可计算出腿部的曲线数据。然后通过图像处理得到一个 长度为 x=300的点数据。

利用Matlab的命令。我尝试用多项式和一些非多项式(比如三角函数)来符合数据(此数据为整个腿部曲线)。发现在没有经验公式可用的情况下效果都不理想。于是只能退而求其次研究简单的小腿弧线。

传说中的经验公式y=1/3*sinθ  是三角函数,因此猜测的公式为: y=a*sin(b*x+c).

结果如图:



红色为腿部曲线,蓝色为符合的小腿曲线函数。

具体数据  a=15.9943    b=0.0191   c= 5.8051

原图中南宫那月的身高约为1000像素,其实际身高约为1.4米(1400mm).所以压缩比为1:1.4


通过还原比例最后的结果表明其小腿曲线函数为: y=22.4sin(0.0136x+4.15) (单位cm)


对比图:





通过比例换算我们可以轻易的得出(15.9943*0.0191=0.305)  y=0.305sin(th+0.184)

可见其小腿曲线是接近1/3sin(th) 这个经验公式的。

代码:


% load an image from a web site,
% save the scaled image to a local file

clear all; close all; clc;

url = 'http://image16.poco.cn/mypoco/myphoto/20140525/03/4528375020140525035544094.jpg';
localfile1 = 'tui.jpg';
webfile = 'tui.htm';

img = imread(url);          % load the desired image
imwrite(img,localfile1);    % save it to a local file


% make a web page to display the images
fp = fopen(webfile,'wt');
fprintf(fp,'<center>\n');
fprintf(fp,'<img src=%s><br>Original Image<p>\n',localfile1);
fprintf(fp,'</center>\n');
fclose(fp);
web(webfile); % display the web page

% use red noly
red1=img(:,:,1);
x1=length(red1)-19;
x=1:x1;
y = [];
for i=1:x1
    yy= red1(:,i);
    h=length(yy)
    hh = 0;
  for n=1:h
    if yy(n)>=252   
    hh=hh+1;
    else
     break
    end
  end
  y(i)=54-hh;%max(hh)=54
end
plot(x,y,'r-');
axis equal % x and y axis units are set equal
title( 'tui bu qu xian');

y1=y(58:162);%use the region 58-162 for calf
x1=x(58:162);

% nlinfit
funky=@(b,x1)b(1)*sin(b(2)*x1+b(3));
beta = nlinfit(x1,y1,funky,[0.1 0.1 0.1 ])
hold on;
plot(x1,funky(beta,x1),'b-')
A=beta(1);
w=beta(2);
p=beta(3);
txt=sprintf('Curve fit: y= %.2fsin(%.2f x + %.2f),(58<=x<=62)',A,w,p);
legend('Data',txt);
xlabel('x');
ylabel('y');


-------5.26更新-------------------------------------------------------------------


分段函数这么简单的方法都忘了。。。。。

最后结果如图:

           |  0.0016x^2 +  0.0728x - 0.2705     ,     0<=x<=58
y(x) = |  15.9943sin( 0.0191x + 5.8051)      ,      58<x<160
           |  0.0034x^2 - 1.1308x + 103.0777  , 160<=x<=210
           |  -27.9595sin( -0.0111x - 17.0257)   ,   210<x<=300




找了一个垂直视角的图进一步分析:




简单的通过椭圆公式模拟曲面,最后结果如图:




更新最终的3D效果图:







所用腿部图片:



代码:(这个乱点,懒得改备注了)


% load an image from a web site,
% save the scaled image to a local file

clear all; close all; clc;

url2 = 'http://image16.poco.cn/mypoco/myphoto/20140526/04/4528375020140526045514062.jpg';
localfile1 = 'tui2.jpg';
webfile2 = 'tui2.htm';

img2 = imread(url2);          % load the desired image
imwrite(img2,localfile1);    % save it to a local file


% make a web page to display the images
fp = fopen(webfile2,'wt');
fprintf(fp,'<center>\n');
fprintf(fp,'<img src=%s><br>Original Image<p>\n',localfile1);
fprintf(fp,'</center>\n');
fclose(fp);
web(webfile2); % display the web page

% use red noly
red1=img2(:,:,1);
x1=length(red1);
x=1:x1;
y2= [];
for i=1:x1
    yy= red1(:,i);
    h=length(yy);
    hh = 0;
  for n=1:h
    if yy(n)>=198   
    hh=hh+1;
    else
     break
    end
  end
  y(i)=63-hh;%max(hh)=54
end
plot(x,y,'r-');
axis equal % x and y axis units are set equal
title( 'tui bu qu xian');
for i=1:x1
    yy2= red1(:,i);
    h=length(yy2);
    hh = 0;
  for n=1:h
    if yy2(n)<=248   
    hh=hh+1;
    else
     break
    end
  end
  y2(i)=64-hh;%max(hh)=54
end



hold on

% nlinfit
plot(x,y2,'b-')

xlabel('x');
ylabel('y');

red2=flipud(red1);
x1=length(red2);
x=1:x1;
y3= [];
for i=1:x1
    yy= red2(:,i);
    h=length(yy);
    hh = 0;
  for n=1:h
    if yy(n)>=198   
    hh=hh+1;
    else
     break
    end
  end
  y3(i)=hh-60;%max(hh)=54
end
hold on

% nlinfit
plot(x,y3,'b-')
ya=[];
yb=[];
for i=1:x1
ya(i)=y(i)+y2(i);
yb(i)=abs(y3(i)-y2(i));
end


url = 'http://image16.poco.cn/mypoco/myphoto/20140525/03/4528375020140525035544094.jpg';
localfile1 = 'tui.jpg';
webfile = 'tui.htm';

img = imread(url);          % load the desired image
imwrite(img,localfile1);    % save it to a local file


% use red noly
red1=img(:,:,1);
xs=length(red1)-19;
ys = [];
for i=1:xs
    yy= red1(:,i);
    h=length(yy)
    hh = 0;
  for n=1:h
    if yy(n)>=252   
    hh=hh+1;
    else
     break
    end
  end
  ys(i)=62-hh;%max(hh)=54
end

yx=ys;
%plot(x,yx(1:167),'b-')

A = [];
B = [];
for n=1:x1

  for i=1:50
    if i<=ya(n)
    yc(i)=((1-(i-1)^2/(ya(n))^2)*yx(n)^2)^0.5;

    else
        yc(i)=0;

    end
  end
  for ii=1:50
    if ii<=yb(n)
    yc2(ii)=(1-(ii-1)^2/(yb(n))^2)^0.5*yx(n);
    else
        yc2(ii)=0;
    end
  end
A = [A; yc];
B = [B; yc2];
end

figure(2)
yd=A';
ye=flipud(B');
z=[ye ;yd];

[x,y] = meshgrid([1:1:167],[1:1:100]);

% draw the surface
h = surf(x,y,z);

axis equal % x and y axis units are set equal

%img = imread(['http://image16.poco.cn/mypoco/myphoto/20140525/07/452837502014052507454102.jpg?690x951_120']);
%set(h,'CData',img,'FaceColor','texturemap')
axis off



------------------------------------------------------






把原图载入一下直接变成3D黑丝。。。。。






回复

使用道具 举报

     
发表于 2014-5-25 08:55 | 显示全部楼层
工科男的最期。

——— 来自Stage1st Reader For iOS
回复

使用道具 举报

     
发表于 2014-5-25 08:55 来自手机 | 显示全部楼层
技术就算用错了方向,还是那么美。
回复

使用道具 举报

     
发表于 2014-5-25 08:58 | 显示全部楼层
..........................................................................(摔
回复

使用道具 举报

     
发表于 2014-5-25 09:03 | 显示全部楼层
下一步是写个程序自动筛选出符合经验公式的腿型?
回复

使用道具 举报

发表于 2014-5-25 09:15 | 显示全部楼层
lz可以测试一下比较丰满的小腿是不是2/3sin(th)
回复

使用道具 举报

     
发表于 2014-5-25 09:19 | 显示全部楼层

y=1/3*sinθ
回复

使用道具 举报

头像被屏蔽
     
发表于 2014-5-25 09:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2014-5-25 09:28 | 显示全部楼层
谢谢大大的范例,最近正被MATLAB虐
回复

使用道具 举报

     
发表于 2014-5-25 09:32 | 显示全部楼层
有理有据 让人信服
回复

使用道具 举报

     
发表于 2014-5-25 09:32 | 显示全部楼层
有理有据 让人信服
回复

使用道具 举报

     
 楼主| 发表于 2014-5-25 10:08 | 显示全部楼层
lyz1196 发表于 2014-5-25 09:27
lz不去研究一下新房45°的误差分布吗

如何计算脸的角度,这个需要脸部识别技术。这个有难度....
回复

使用道具 举报

     
发表于 2014-5-25 10:24 | 显示全部楼层
回复

使用道具 举报

     
发表于 2014-5-25 10:51 | 显示全部楼层
样本数量太少了啊!起码30个啊!统计没学过么?
回复

使用道具 举报

头像被屏蔽
     
发表于 2014-5-25 10:55 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2014-5-25 11:13 | 显示全部楼层
不拿两条腿都实验一下么
回复

使用道具 举报

     
发表于 2014-5-25 11:20 | 显示全部楼层
曲线...救国?
回复

使用道具 举报

头像被屏蔽
     
发表于 2014-5-25 11:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2014-5-25 12:08 | 显示全部楼层
佩服得五体投地
回复

使用道具 举报

     
发表于 2014-5-25 14:35 | 显示全部楼层
所以人类的科技树被一次又一次的被点歪。
回复

使用道具 举报

     
 楼主| 发表于 2014-5-25 18:34 | 显示全部楼层
lyz1196 发表于 2014-5-25 11:57
搞个划线的软件,自己多画几遍,拟合一下?

理论上可以自动画线。S1程序员满地爬,这就不是个事。
回复

使用道具 举报

     
发表于 2014-5-25 19:09 | 显示全部楼层
愧为理科生……
回复

使用道具 举报

     
发表于 2014-5-25 19:16 | 显示全部楼层
你说这些谁懂啊,反正那月酱prpr就对了
回复

使用道具 举报

     
发表于 2014-5-25 19:27 | 显示全部楼层
首先,你要确定一个法向,因为楼顶计算的只是三维曲面在二维平面上的投影,而我们知道不同的法向会导致投影的变化,所以楼主至少要取两个正交的投影平面进行研究,而且最终的结论也应该是一个曲面方程
回复

使用道具 举报

     
 楼主| 发表于 2014-5-25 20:16 | 显示全部楼层
apefrank 发表于 2014-5-25 19:27
首先,你要确定一个法向,因为楼顶计算的只是三维曲面在二维平面上的投影,而我们知道不同的法向会导致投影 ...

动画,漫画,插画这些都是2D构图,所以不是3D投影,而是本质就是2D。

要算3D曲面几乎是不可能的。除非像LoveLive那样本身就存在3D人设那还有可能。
回复

使用道具 举报

头像被屏蔽
     
发表于 2014-5-25 20:19 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
发表于 2014-5-25 20:29 | 显示全部楼层
玉米黍 发表于 2014-5-25 20:16
动画,漫画,插画这些都是2D构图,所以不是3D投影,而是本质就是2D。

要算3D曲面几乎是不可能的。除非像 ...

……施主您着相了
回复

使用道具 举报

头像被屏蔽
发表于 2014-5-25 20:41 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

     
 楼主| 发表于 2014-5-26 00:47 | 显示全部楼层
本帖最后由 玉米黍 于 2014-5-26 00:54 编辑

新思路是分段函数。把整个腿部分4段。待我有空了,就更新。

欢迎·提供·各种·新的素材/腿部图片以供研究。
回复

使用道具 举报

     
发表于 2014-5-26 00:57 | 显示全部楼层
这TM才是漫区!
回复

使用道具 举报

     
发表于 2014-5-26 01:06 | 显示全部楼层

想说点什么...还是算了吧
回复

使用道具 举报

     
发表于 2014-5-26 02:14 | 显示全部楼层
本帖最后由 城管 于 2014-5-26 14:27 编辑

小腿的曲线是y=1/3*sinθ的话,欧派的曲线是多少?
y=|sinθ|?
回复

使用道具 举报

     
 楼主| 发表于 2014-5-26 04:24 | 显示全部楼层
本帖最后由 玉米黍 于 2014-5-26 04:29 编辑

分段函数这么简单的方法都忘了。。。。。

最后结果如图:

           |  0.0016x^2 +  0.0728x - 0.2705     ,     0<=x<=58
y(x) = |  15.9943sin( 0.0191x + 5.8051)      ,      58<x<160
           |  0.0034x^2 - 1.1308x + 103.0777  , 160<=x<=210
           |  -27.9595sin( -0.0111x - 17.0257)   ,   210<x<=300




回复

使用道具 举报

     
发表于 2014-5-26 04:43 | 显示全部楼层
一个栗子说明不了问题啊,lz不多上些对比?
回复

使用道具 举报

发表于 2014-5-26 05:52 | 显示全部楼层
楼主怎么把曲线给从原图里提炼出来的?忒久没用metlab了。
回复

使用道具 举报

     
发表于 2014-5-26 06:09 | 显示全部楼层
hoh 发表于 2014-5-26 05:52
楼主怎么把曲线给从原图里提炼出来的?忒久没用metlab了。

metlab233 确实很久没用了
回复

使用道具 举报

     
 楼主| 发表于 2014-5-26 06:32 | 显示全部楼层
hoh 发表于 2014-5-26 05:52
楼主怎么把曲线给从原图里提炼出来的?忒久没用metlab了。

用FOR   loop计算红色的像素点数直到黑丝(黑色缺乏红色)为止
回复

使用道具 举报

发表于 2014-5-26 06:49 | 显示全部楼层
身高参数换算成角度是通过什么方法的?
回复

使用道具 举报

发表于 2014-5-26 07:09 | 显示全部楼层
相信我,如果只是小腿肚那一段的话,你拿段抛物线也能得到差不多的结果,而且最好以整段小腿为单位做归一化以后才能得到比例,按像素单位说明不了问题啊

有更多可以量化的指标可以做啊,比如腿的粗细的变化(曲线上沿减下沿),小腿肚和大腿的粗细比例
回复

使用道具 举报

     
 楼主| 发表于 2014-5-26 08:42 | 显示全部楼层
找了一个垂直视角的图进一步分析:




简单的通过椭圆公式模拟曲面,最后结果如图:

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|上海互联网违法和不良信息举报中心|网上有害信息举报专区|962110 反电信诈骗|举报电话 021-62035905|Stage1st ( 沪ICP备13020230号-1|沪公网安备 31010702007642号 )

GMT+8, 2024-11-21 19:51 , Processed in 0.128834 second(s), 5 queries , Gzip On, Redis On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表