相当简单,但有效的方法来区分图纸和照片。将它们组合使用以达到最佳精度:
1)哑剧类型或文件扩展名
PNG通常是剪贴画或绘画,而JPEG大多是照片。
2) 透明度
如果图像具有 Alpha 通道,则很可能是绘图。如果存在 Alpha 通道,还可以额外迭代所有像素,以检查是否确实使用了透明度。下面是一个 Python 示例代码:
from PIL import Image
img = Image.open('test.png')
transparency = False
if img.mode in ('RGBA', 'RGBa', 'LA') or (img.mode == 'P' and 'transparency' in img.info):
if img.mode != 'RGBA': img = img.convert('RGBA')
transparency = any(px for px in img.getdata() if px[3] < 220)
print 'Transparency:', transparency
3) 颜色分布
剪贴画通常具有相同颜色的区域。如果几种颜色构成了图像的重要部分,那么它更像是一幅画而不是一张照片。此代码输出由十种最常用的颜色组成的图像区域的百分比(Python 示例):
from PIL import Image
img = Image.open('test.jpg')
img.thumbnail((200, 200), Image.ANTIALIAS)
w, h = img.size
print sum(x[0] for x in sorted(img.convert('RGB').getcolors(w*h), key=lambda x: x[0], reverse=True)[:10])/float((w*h))
您需要调整和优化这些值。十种颜色是否足以满足您的数据需求?什么百分比最适合您。通过测试大量示例图像来找出答案。30%或更多通常是剪贴画。不过,不适用于天空照片或类似照片。因此,我们需要另一种方法 - 下一种方法。
4) 通过FFT进行锐边检测
锐利的边缘导致傅里叶频谱中的高频。通常,这些功能在图纸中更常见(另一个Python片段):
from PIL import Image
import numpy as np
img = Image.open('test.jpg').convert('L')
values = abs(numpy.fft.fft2(numpy.asarray(img.convert('L')))).flatten().tolist()
high_values = [x for x in values if x > 10000]
high_values_ratio = 100*(float(len(high_values))/len(values))
print high_values_ratio
此代码为您提供每个区域超过 100 万的频率数。再次:根据您的示例图像优化此类数字。
针对您的映像集组合并优化这些方法。让我知道,如果你可以改进这个 - 或者只是编辑这个答案,请。我想自己改进它:-)
这个问题可以通过图像分类来解决,这可能是谷歌解决问题的方法。基本上,您要做的是(i)将一组图像标记为3类:照片,剪贴画和线条画;(ii) 从这些图像中提取特征;(iii)使用图像的特征和标签来训练分类器。
特征提取:
在此步骤中,您必须提取可能对分类器区分 3 类图像有用的视觉信息:
- 一个非常基本但有用的视觉特征是图像直方图及其变体。例如,照片的灰度级直方图可能比剪贴画的直方图更平滑,在剪贴画中,您的区域可能具有相同的颜色值。
- 可以使用的另一个功能是将图像转换为频域(例如使用FFT或DCT)并测量高频分量的能量。由于线条图可能会有明显的颜色过渡,因此其高频分量往往会积累更多的能量。
还有许多其他特征提取算法可以使用。
训练分类器:
在特征提取阶段之后,我们将为每个图像提供一个数值向量(我们称之为图像特征向量)及其元组。这是训练分类器的合适输入。至于分类器,可以考虑神经网络,SVM等。
分类:
现在我们有一个经过训练的分类器,要对图像进行分类(即检测图像类别),我们只需要提取其特征并将其输入到分类器中,它将返回其预测的类别。
-
如何使用Java中的RESTful Web服务获取远程/客户端IP地址? 我已经在我的项目中编写了Rest Web服务。Web服务调用可能来自不同 machine.so 我需要通过REST Web服务找出IP地址。 从这个请求.getRemoteAddr()使用这个。 但是我不能使用getRemoteAddr()。因为我的请
-
从包含大量文件的zip文件中提取1文件的最快方法是什么? 我尝试了但它们也缺少一些东西。 LZMA SDK不提供一种如何使用的文档/教程,这非常令人沮丧。没有 javadoc。 虽然7z jbinding没有提供一种简单的方法来只提取1个文件,但是,它只提供了提取zip文件
-
输入/输出流在销毁时是否关闭? Java 中的 InputStreams 和 OutputStreams 是否在销毁时关闭()?我完全理解这可能是不好的形式(特别是在C和C++世界中),但我很好奇。 另外,假设我有以下代码: 无名的FileInputStream是否在p.load
-
Java 程序中的字符串大小是否有任何限制? 我有一个字符串定义为 字符串 xx 我可以分配的字符数是否有任何限制? 2) 我正在将用户输入分配给此字符串 xx。70%的人只说一个字。有时他们给出一个大句子,所以想知道可
-