Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 如何自动确定图像文件是描述照片还是';图形';?_Image Processing_Imagemagick_Photo_Graphic - Fatal编程技术网

Image processing 如何自动确定图像文件是描述照片还是';图形';?

Image processing 如何自动确定图像文件是描述照片还是';图形';?,image-processing,imagemagick,photo,graphic,Image Processing,Imagemagick,Photo,Graphic,如何自动确定图像文件是描述照片还是“图形” 例如,使用Imagemagick?计算图像的熵。人工图像的熵通常比照片低得多。我在这方面的知识有些有限,但我读了一篇论文,找到了一种用ImageMagick计算图像熵的方法-一些聪明人可能会检查它 #!/bin/bash image=$1 # Get number of pixels in image px=$(convert -format "%w*%h\n" "$image" info:|bc) # Calculate entropy # See

如何自动确定图像文件是描述照片还是“图形”


例如,使用Imagemagick?

计算图像的熵。人工图像的熵通常比照片低得多。

我在这方面的知识有些有限,但我读了一篇论文,找到了一种用ImageMagick计算图像熵的方法-一些聪明人可能会检查它

#!/bin/bash
image=$1
# Get number of pixels in image
px=$(convert -format "%w*%h\n" "$image" info:|bc)
# Calculate entropy 
# See this paper www1.idc.ac.il/toky/imageProc-10/Lectures/04_histogram_10.ppt
convert "$image" -colorspace gray -depth 8 -format "%c" histogram:info:- | \
   awk -F: -v px=$px '{p=$1/px;e+=-p*log(p)} END {print e}'
因此,您可以将上面的脚本保存为
entropy
,然后执行以下一次以使其可执行:

chmod +x entropy
然后你可以这样使用它:

entropy image.jpg
#!/bin/bash
# Calculate Red Green covariance of image supplied as parameter
image=$1
convert "$image" -depth 8 txt: | awk ' \
    {split($2,a,",")
     sub(/\(/,"",a[1]);R[NR]=a[1];
     G[NR]=a[2];
     # sub(/\)/,"",a[3]);B[NR]=a[3]
    }
    END{
      # Calculate mean of R,G and B
      for(i=1;i<=NR;i++){
         Rmean=Rmean+R[i]
         Gmean=Gmean+G[i]
         #Bmean=Bmean+B[i]
      }
      Rmean=Rmean/NR
      Gmean=Gmean/NR
      #Bmean=Bmean/NR
      # Calculate Green-Red and Green-Blue covariance
      for(i=1;i<=NR;i++){
          GRcov+=(G[i]-Gmean)*(R[i]-Rmean)
          #GBcov+=(G[i]-Gmean)*(B[i]-Bmean)
      }
      GRcov=GRcov/NR
      #GBcov=GBcov/NR
      print "Green Red covariance: ",GRcov
      #print "GBcovariance: ",GBcov
    }'
convert photo.jpg -colorspace gray -depth 8 -format %c histogram:info:-| egrep "\(0\)|\(255\)"
     2: (  0,  0,  0) #000000 gray(0)
   537: (255,255,255) #FFFFFF gray(255)
它似乎确实为真实照片生成了更大的数字,而为计算机图形生成了更低的数字

另一个想法是研究信道间的相关性。通常,在数码照片上,不同波长的光彼此之间有着非常强的相关性,因此,如果红色成分增加,绿色和蓝色成分也会增加,但是如果红色成分减少,绿色和蓝色也会减少。如果你将其与计算机图形相比较,人们倾向于使用粗体的原色绘制图形,因此,一个大的红色条形图或饼图图形在通道之间根本不会有关联。我拍摄了一张风景的数码照片,并将其大小调整为1像素宽64像素高,我正在使用下面的ImageMagick显示它-你会看到红色下降的地方,绿色和蓝色也会下降

convert DSC01447.JPG -resize 1x64! -depth 8 txt:

0,0: (168,199,235)  #A8C7EB  srgb(168,199,235)
0,1: (171,201,236)  #ABC9EC  srgb(171,201,236)
0,2: (174,202,236)  #AECAEC  srgb(174,202,236)
0,3: (176,204,236)  #B0CCEC  srgb(176,204,236)
0,4: (179,205,237)  #B3CDED  srgb(179,205,237)
0,5: (181,207,236)  #B5CFEC  srgb(181,207,236)
0,6: (183,208,236)  #B7D0EC  srgb(183,208,236)
0,7: (186,210,236)  #BAD2EC  srgb(186,210,236)
0,8: (188,211,235)  #BCD3EB  srgb(188,211,235)
0,9: (190,212,236)  #BED4EC  srgb(190,212,236)
0,10: (192,213,234)  #C0D5EA  srgb(192,213,234)
0,11: (192,211,227)  #C0D3E3  srgb(192,211,227)
0,12: (191,208,221)  #BFD0DD  srgb(191,208,221)
0,13: (190,206,216)  #BECED8  srgb(190,206,216)
0,14: (193,207,217)  #C1CFD9  srgb(193,207,217)
0,15: (181,194,199)  #B5C2C7  srgb(181,194,199)
0,16: (158,167,167)  #9EA7A7  srgb(158,167,167)
0,17: (141,149,143)  #8D958F  srgb(141,149,143)
0,18: (108,111,98)  #6C6F62  srgb(108,111,98)
0,19: (89,89,74)  #59594A  srgb(89,89,74)
0,20: (77,76,61)  #4D4C3D  srgb(77,76,61)
0,21: (67,64,49)  #434031  srgb(67,64,49)
0,22: (57,56,43)  #39382B  srgb(57,56,43)
0,23: (40,40,34)  #282822  srgb(40,40,34)
0,24: (39,38,35)  #272623  srgb(39,38,35)
0,25: (38,37,37)  #262525  srgb(38,37,37)
0,26: (40,39,38)  #282726  srgb(40,39,38)
0,27: (78,78,57)  #4E4E39  srgb(78,78,57)
0,28: (123,117,90)  #7B755A  srgb(123,117,90)
0,29: (170,156,125)  #AA9C7D  srgb(170,156,125)
0,30: (168,154,116)  #A89A74  srgb(168,154,116)
0,31: (153,146,96)  #999260  srgb(153,146,96)
0,32: (156,148,101)  #9C9465  srgb(156,148,101)
0,33: (152,141,98)  #988D62  srgb(152,141,98)
0,34: (151,139,99)  #978B63  srgb(151,139,99)
0,35: (150,139,101)  #968B65  srgb(150,139,101)
0,36: (146,135,98)  #928762  srgb(146,135,98)
0,37: (145,136,97)  #918861  srgb(145,136,97)
0,38: (143,133,94)  #8F855E  srgb(143,133,94)
0,39: (140,133,92)  #8C855C  srgb(140,133,92)
0,40: (137,133,92)  #89855C  srgb(137,133,92)
0,41: (136,133,91)  #88855B  srgb(136,133,91)
0,42: (131,124,81)  #837C51  srgb(131,124,81)
0,43: (130,121,78)  #82794E  srgb(130,121,78)
0,44: (134,123,78)  #867B4E  srgb(134,123,78)
0,45: (135,127,78)  #877F4E  srgb(135,127,78)
0,46: (135,129,79)  #87814F  srgb(135,129,79)
0,47: (129,125,77)  #817D4D  srgb(129,125,77)
0,48: (106,105,65)  #6A6941  srgb(106,105,65)
0,49: (97,99,60)  #61633C  srgb(97,99,60)
0,50: (120,121,69)  #787945  srgb(120,121,69)
0,51: (111,111,63)  #6F6F3F  srgb(111,111,63)
0,52: (95,98,55)  #5F6237  srgb(95,98,55)
0,53: (110,111,63)  #6E6F3F  srgb(110,111,63)
0,54: (102,105,60)  #66693C  srgb(102,105,60)
0,55: (118,120,66)  #767842  srgb(118,120,66)
0,56: (124,124,68)  #7C7C44  srgb(124,124,68)
0,57: (118,120,65)  #767841  srgb(118,120,65)
0,58: (114,116,64)  #727440  srgb(114,116,64)
0,59: (113,114,63)  #71723F  srgb(113,114,63)
0,60: (116,117,64)  #747540  srgb(116,117,64)
0,61: (118,118,65)  #767641  srgb(118,118,65)
0,62: (118,117,65)  #767541  srgb(118,117,65)
0,63: (114,114,62)  #72723E  srgb(114,114,62)
统计上,这是协方差。我倾向于使用照片的红色和绿色通道来评估这一点,因为在拜耳网格中,每个红色和蓝色的站点都有两个绿色站点,因此绿色通道在这两个站点上是平均的,因此最不容易受到噪声的影响。蓝色最容易受到噪音的影响。所以测量协方差的代码可以这样写:

entropy image.jpg
#!/bin/bash
# Calculate Red Green covariance of image supplied as parameter
image=$1
convert "$image" -depth 8 txt: | awk ' \
    {split($2,a,",")
     sub(/\(/,"",a[1]);R[NR]=a[1];
     G[NR]=a[2];
     # sub(/\)/,"",a[3]);B[NR]=a[3]
    }
    END{
      # Calculate mean of R,G and B
      for(i=1;i<=NR;i++){
         Rmean=Rmean+R[i]
         Gmean=Gmean+G[i]
         #Bmean=Bmean+B[i]
      }
      Rmean=Rmean/NR
      Gmean=Gmean/NR
      #Bmean=Bmean/NR
      # Calculate Green-Red and Green-Blue covariance
      for(i=1;i<=NR;i++){
          GRcov+=(G[i]-Gmean)*(R[i]-Rmean)
          #GBcov+=(G[i]-Gmean)*(B[i]-Bmean)
      }
      GRcov=GRcov/NR
      #GBcov=GBcov/NR
      print "Green Red covariance: ",GRcov
      #print "GBcovariance: ",GBcov
    }'
convert photo.jpg -colorspace gray -depth 8 -format %c histogram:info:-| egrep "\(0\)|\(255\)"
     2: (  0,  0,  0) #000000 gray(0)
   537: (255,255,255) #FFFFFF gray(255)
这个有2个黑色和537个纯白色像素

我想你现在可能已经有足够的时间来做一个像样的启发式了

根据我的评论,您可以使用以下ImageMagick命令:

# Get EXIF information
identify -format "%[EXIF*]" image.jpg

# Get number of colours
convert image.jpg -format "%k" info:
其他响应者可能会建议其他参数,您可以通过以下方式找到其中大部分参数:

identify -verbose image.jpg

您需要提出一种适用于您的应用程序的启发式方法。假设“照片”是指相机拍摄的照片,那么如何定义“图形”?即使是人的眼睛也可能被一家好的“商店”所愚弄,因此很难普遍地判断一个图像文件是否是一张照片。但是:如果所讨论的“图形”是一个简单的图形或图表,那么您可以根据图像的“信息密度”自动做出相当好的猜测。照片往往比图表有更鲜明的颜色。这是相当广泛的!你有例子吗?最简单的方法是使用EXIF数据(如果存在)。一般来说,真实照片也有更多的颜色,但这还不确定,有些图形很难与照片区分开来。有什么关于如何做到这一点的建议/参考吗?我忘了补充一点,上面的内容总是可以在PHP/Perl/C中实现以加快速度-awk不是最快的,它只是让你不用太多努力就可以尝试算法。Mark,你能在下一个ImageMagick版本后更新你的答案吗?我们在-format中添加了“%[熵]”。我将尝试在苏格兰赫布里底群岛的荒野中使用-am,几乎没有连接。谢谢你的评论。@dlemstra:我现在回来了,并更新到IM V8.9-8。我刚刚尝试了
convert image.png-format“%[entropy]”信息:
,但我得到了
未知图像属性
。有什么想法吗?你至少需要IM v6.9.0-0