玉米黍 发表于 2014-5-25 08:42

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

本帖最后由 玉米黍 于 2014-5-26 11:20 编辑

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

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

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


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

http://image16.poco.cn/mypoco/myphoto/20140525/07/452837502014052507454102.jpg?690x951_120


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


http://image16.poco.cn/mypoco/myphoto/20140525/03/4528375020140525035544094.jpg?319x117_120

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

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

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

结果如图:

http://image16.poco.cn/mypoco/myphoto/20140525/07/4528375020140525074633065.jpg?573x510_120

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

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

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


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


对比图:
http://image16.poco.cn/mypoco/myphoto/20140525/07/4528375020140525074715024.jpg?600x453_120




通过比例换算我们可以轻易的得出(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,)
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

http://image16.poco.cn/mypoco/myphoto/20140526/04/4528375020140526041356070.jpg


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

http://image16.poco.cn/mypoco/myphoto/20140526/08/4528375020140526083406077.jpg


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

http://image16.poco.cn/mypoco/myphoto/20140526/08/4528375020140526083508024.jpg


更新最终的3D效果图:

http://image16.poco.cn/mypoco/myphoto/20140526/10/45283750201405252229362688602201483_004.jpg
http://image16.poco.cn/mypoco/myphoto/20140526/10/45283750201405252229362688602201483_003.jpg
http://image16.poco.cn/mypoco/myphoto/20140526/10/45283750201405252229362688602201483_002.jpg
http://image16.poco.cn/mypoco/myphoto/20140526/10/45283750201405252229362688602201483_001.jpg


所用腿部图片:

http://image16.poco.cn/mypoco/myphoto/20140526/10/45283750201405252236561319405783273_000.jpg

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


% 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 = ;
B = ;
end

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

= meshgrid(,);

% 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黑丝。。。。。


http://image16.poco.cn/mypoco/myphoto/20140526/11/45283750201405252303562080122349134_001.jpg
http://image16.poco.cn/mypoco/myphoto/20140526/11/45283750201405252303562080122349134_000.jpg


幸福在裆下 发表于 2014-5-25 08:55

工科男的最期。

——— 来自Stage1st Reader For iOS

索兰塔.织姬 发表于 2014-5-25 08:55

技术就算用错了方向,还是那么美。

LaZier 发表于 2014-5-25 08:58

..........................................................................(摔

noneoneone 发表于 2014-5-25 09:03

下一步是写个程序自动筛选出符合经验公式的腿型?

kenqqex 发表于 2014-5-25 09:15

lz可以测试一下比较丰满的小腿是不是2/3sin(th)

zechins 发表于 2014-5-25 09:19

http://ww3.sinaimg.cn/bmiddle/87c7e3b3jw1ego478ih0nj20go0irtbo.jpg
y=1/3*sinθ

lyz1196 发表于 2014-5-25 09:27

lyflyflxf 发表于 2014-5-25 09:28

谢谢大大的范例,最近正被MATLAB虐

gane1010 发表于 2014-5-25 09:32

有理有据 让人信服

gane1010 发表于 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

njzwb123 发表于 2014-5-25 11:13

不拿两条腿都实验一下么

anova105 发表于 2014-5-25 11:20

曲线...救国?

lyz1196 发表于 2014-5-25 11:57

hyjsttt 发表于 2014-5-25 12:08

佩服得五体投地

stygianlunar 发表于 2014-5-25 14:35

所以人类的科技树被一次又一次的被点歪。

玉米黍 发表于 2014-5-25 18:34

lyz1196 发表于 2014-5-25 11:57
搞个划线的软件,自己多画几遍,拟合一下?

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

keiichi 发表于 2014-5-25 19:09

愧为理科生……

skyuni 发表于 2014-5-25 19:16

apefrank 发表于 2014-5-25 19:27

首先,你要确定一个法向,因为楼顶计算的只是三维曲面在二维平面上的投影,而我们知道不同的法向会导致投影的变化,所以楼主至少要取两个正交的投影平面进行研究,而且最终的结论也应该是一个曲面方程

玉米黍 发表于 2014-5-25 20:16

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

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

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

lyz1196 发表于 2014-5-25 20:19

apefrank 发表于 2014-5-25 20:29

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

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

……施主您着相了

macos 发表于 2014-5-25 20:41

玉米黍 发表于 2014-5-26 00:47

本帖最后由 玉米黍 于 2014-5-26 00:54 编辑

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

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

zukey 发表于 2014-5-26 00:57

这TM才是漫区!

bfogda 发表于 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

http://image16.poco.cn/mypoco/myphoto/20140526/04/4528375020140526041356070.jpg?782x621_120


kresnik432 发表于 2014-5-26 04:43

一个栗子说明不了问题啊,lz不多上些对比?

hoh 发表于 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

身高参数换算成角度是通过什么方法的?

alaya 发表于 2014-5-26 07:09

相信我,如果只是小腿肚那一段的话,你拿段抛物线也能得到差不多的结果,而且最好以整段小腿为单位做归一化以后才能得到比例,按像素单位说明不了问题啊

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

玉米黍 发表于 2014-5-26 08:42

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

http://image16.poco.cn/mypoco/myphoto/20140526/08/4528375020140526083406077.jpg


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

http://image16.poco.cn/mypoco/myphoto/20140526/08/4528375020140526083508024.jpg
页: [1] 2 3 4
查看完整版本: [学术] 腿部曲线学:小腿曲线函数的初步研究(更新新科技