我试图确定图像是否平方(像素化)。在Python中检测像素化图像
我听说过使用numpy或scipy进行2D fourrier变换,但它有点复杂。
的目标是确定的平方区的数量,由于恶劣的压缩就像这样(IMG一):
我试图确定图像是否平方(像素化)。在Python中检测像素化图像
我听说过使用numpy或scipy进行2D fourrier变换,但它有点复杂。
的目标是确定的平方区的数量,由于恶劣的压缩就像这样(IMG一):
我不知道这是否会工作 - 但是,有些东西你可以尝试是获取像素周围的最近邻居。像素化正方形将成为区域周围RGB值的可见跳转。
你可以找到的东西每个像素最近邻图像中像
def get_neighbors(x,y, img):
ops = [-1, 0, +1]
pixels = []
for opy in ops:
for opx in ops:
try:
pixels.append(img[x+opx][y+opy])
except:
pass
return pixels
这会给你在你的源图像的区域最近的像素。
要使用它,你会做这样的事情
def detect_pixellated(fp):
img = misc.imread(fp)
width, height = np.shape(img)[0:2]
# Pixel change to detect edge
threshold = 20
for x in range(width):
for y in range(height):
neighbors = get_neighbors(x, y, img)
# Neighbors come in this order:
# 6 7 8
# 3 4 5
# 0 1 2
center = neighbor[4]
del neighbor[4]
for neighbor in neighbors:
diffs = map(operator.abs, map(operator.sub, neighbor, center))
possibleEdge = all(diff > threshold for diff in diffs)
进一步的思考,虽然,使用OpenCV的经过,并做边缘检测,并得到轮廓大小。这将会更容易,更强大。
最后一段“......使用OpenCV并进行边缘检测并获得轮廓大小......”确实有帮助!谢谢 – Hamed
如果你扫描它的行,它会稍微容易一些,因为那样你就可以处理线性图而不是二维图,这总是比较简单。
解决方案:
扫描跨越像素的线,放线在阵列如果它是更快地用于计算访问,然后对线(S)上运行的算法来确定所述块效应:
1 /遍历行中的每个像素,并通过减去两个像素之间的值来将它与前一个像素进行比较。制作一组以前的像素值。如果像素值中的大跳跃是规则的宽度,那么它是块状的。如果数值有较大的跃变并伴随着小的跳跃值,那么它就是块状的......你可以假设如果有许多相等的像素差异,那么它是块状的,尤其是如果你以2和4的相邻像素间隔重复两次分析,以及在多条线上。
您还可以制作像素间像素差异3-5-10像素的图形,以获取有关图像采样线的梯度变化的附加信息。如果相邻像素和第5个相邻像素的像素差异比例相似,则它也表示不平滑的颜色。
可以有许多algorythms,包括线性图上的快速fourrier,与音频一样,你可以在pic上使用这些线,比2d图像algorythm简单。
这只是我的头顶,所以它只是一个评论。你有没有访问原始的,未压缩的图像?如果是这样,您可以尝试对2幅图像进行颜色统计。如果其中一个比另一个低得多,那么你几乎肯定会发生像素化/后缀化。 –
我无法使用原始图像很遗憾 – kollo