那角度是多少?


12

挑战的目标是确定图像中线条的角度。

图片上的规则:

  • 图像背景将为白色(#FFFFFF
  • 线条的笔触将为黑色(#000000
  • 该行不会抗锯齿
  • 图片将为100x100像素
  • 该线将从图像的中心开始
  • 该行将开始向下指向(6-OClock)
  • 该行将是50像素长
  • 从起始位置开始逆时针测量线的角度
  • 图像编解码器将为.jpg.png

输入格式将是命令行arg,脚本输入或函数arg传递的文件名。输出格式很简单-仅输出度数(例如90)。

答案可以是规定量度的±1度。以下是一些示例图片:

1个

带有灰色背景的45度参考图像

1个

0度

2

45度

3

50度

4

130度

6

230度

7

324度

这是用于创建图像的代码(这是使用Processing编码的):

int deg = 45;

int centX = width/2, centY = height/2;

background(255);
noSmooth();
line(centX,
     centY,
     centX + sin(radians(deg))*50,
     centY + cos(radians(deg))*50);

saveFrame("line-"+deg+".png");// image codec can be changed here. use '.png' or '.jpg'

1
我收到反对票了吗?如果可以,选民为什么要退飞机?
J Atkin

我们可以只显示它,而不将其保存到文件中吗?
ev3commander

当然,这就是所有其他答案的方式。只需将控制台生成的答案打印到控制台即可。
J Atkin

1
@JAtkin我不会担心通常被推荐的帖子的被否决。c:我们都明白。
Addison Crump 2015年

原来如此。我不知道为什么
要买

Answers:


7

Pyth- 28 26字节

使用与js回答相同的蛮力策略。

f!@F+]'zm+50s*48.t.tT7d_U2

将输入作为来自stdin的文件名。

f                     Filters from 1 till predicate is matched
 !                    Boolean not so that only pixel with zero value matched
  @F+]                Folds by indexing to get pixel value  
   'z                 Reads image filename input
   m         _U2      Maps over both trig ratios
    +50               Adds 50 to pixel value
     *48              Multiplies pixel value by 48
      .t    d         Takes trig ratio with appropriate option
        .t 7          Degrees to radians
          T           Filter var

哇,这很酷,但是我不讲。您介意添加解释吗?
J Atkin

1
我希望JavaScript在另一方面具有相同的字节数。
insertusername此处,2015年

@insertusernamehere,我希望Groovy或Scala也可以进行这种打高尔夫球。
J Atkin 2015年

@JAtkin说明已添加。如有任何疑问,请随时在聊天中给我发消息。
Maltysen 2015年

9

的JavaScript(ES6),225个227 244字节

让我们滚一下球:

f=s=>{(i=new Image).src=s;c=document.createElement`canvas`.getContext`2d`;c.drawImage(i,0,0,100,100);for(a=360;a--,r=a/180*(m=Math).PI;)if(!c.getImageData(50+48*m.cos(r),50+48*m.sin(r),1,1).data[1]){alert((450-a)%360);break}}

只需将图像的URL传递给函数:

f('90deg.png');

警报度在±1范围内。通过了所有测试案例。

不打高尔夫球

f=s=>{
    // create new image and set source
    (i=new Image).src=s;
    // create canvas and get context
    c=document.createElement`canvas`.getContext`2d`;
    // set width/height to 100px and draw image on canvas
    c.drawImage(i,0,0,100,100);
    // check whether for any degree on the theoretical circle a black pixel is found
    for(a=360;a--,r=a/180*(m=Math).PI;)
        if(!c.getImageData(50+48*m.cos(r),50+48*m.sin(r),1,1).data[1]){
            // wait, it should be ccw and the board is rotated 90 degrees
            alert((450-a)%360);
            break
        }
}

编辑

  • 保存了 17个字节 -认为我不需要设置canvas元素的宽度和高度。
  • 否定条件可节省2个字节

我认为这应该工作(尚未测试)。206字节:s=>{(i=new Image).src=s;with(Math)with(document.createElement`canvas`.getContext`2d`)for(drawImage(i,0,0,100,100),a=360;r=--a/180*PI;)getImageData(50+48*cos(r),50+48*sin(r),1,1).data[1]||alert((450-a)%360)}
user81655,2015年

1
该代码有效,因为您很幸运。几乎每次都会弄脏画布。特别是file://。您需要设置crossOrigin属性。同样,如果图像加载比创建画布花费的时间多0.00001秒,则它将不起作用。此外,您不需要,也可以f=剪掉2个字节。但这确实是一个不错的解决方案!!!我对此表示赞同。
Ismael Miguel

@IsmaelMiguel感谢您的详细反馈。你是对的画布。在开始时,我尝试旋转并镜像图像,以便不需要变换角度。您可以告别!变得模糊,找不到正确的像素。因此,我跳过了该onload部分,因为我在另一个挑战中被削弱了。因此,我认为可以假定它加载得足够快是可以的。关于匿名函数,我不确定如何计数。如果我切断f=并且想要调用它,则必须将它包装成()like (s=>{})('arg');。我可以忽略字节数吗?
2015年

@insertusernamehere是的,您可以忽略字节数。但是您必须指定它是一个匿名函数
Ismael Miguel

5

Matlab,118104字节

我生成一个与图像相同大小的矩阵,该矩阵具有复数(中心为0),并从该矩阵中提取直线上的值。然后显示这些均值的参数。

感谢@ThomasKwa建议提高准确性,这也缩短了代码!!!

I=imread(input('','s'));
[y,x]=ndgrid(-50:49);
c=y+i*x;
disp(mod(angle(mean(c(~I(:,:,1))))*180/pi+360,360))

1
找到线上所有点均值的论点会更短吗?
lirtosiast

哇,这比我预期的答案要短得多,干得好!
J Atkin

@ThomasKwa绝对可以,但是那样会不那么精确,因为靠近中心的像素绝对不准确。我想,如果您想尝试,也可以在Octave中运行此代码!
flawr

均值的自变量(应使直线中心的自变量具有相当好的准确性),而不是自变量的均值。我不知道准确性是否可以接受。
lirtosiast 2015年

1
@ThomasKwa好主意,谢谢!现在的精度甚至更高,代码短了几个字节=)
更加模糊的

5

Matlab, 86 77字节

这是使用Matlab的另一种方法:

[I,J]=find(~im2bw(imread(input('','s'))));mode(mod(round(atan2d(J-51,I-51)),360))

这将读取文件(从faker偷来的),并找到黑色像素的索引。然后,它计算出从图像中心指向每个黑色像素的向量,并用于atan2d查找角度,四舍五入以获取整数角度,并进行操作mod(...,360)以获取正确范围内的结果。要获得正确的角度(靠近中心的像素会有一些误差),请采用最常用的角度。

感谢slvrbldim2bw建议!


1
通过用[I,J] = find(〜im2bw(imread(input(''))))替换mode(...)之前的部分,可以将您的代码减少到77个字节
slvrbld 2015年

好东西!谢谢,我确信有一种方法可以更轻松地做到这一点,但不记得了。
大卫

3

Labview,10098字节

让我们在那里放置另一个Labview代码。

由于没有正式的方法来计算labview中的字节数,因此在保存时我使用文件的大小。或者将每条导线和功能计为1,将情况计为2,则得出71。

1个

加载图像,展平为1D,从两侧扫描0s,然后取第一个,计算返回点,并使用几何来获取角度。


1
很好,这很有趣。您可能想在meta上询问如何对labview程序评分。
J Atkin 2015年

已经有一个如何计分的主题,但是很遗憾,目前还没有答案
Eumel 2015年

原来如此。我刚编辑您的文章,以使字节数更可以理解为我们A.美国
Ĵ阿特

@JAtkin作为一个欧洲人,让我挠头,想知道他是如何得到这些字节的。请问各方不要使用空格吗?
亚伦

呵呵,我忘了你们,的小数位。
J Atkin
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.