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