【问题标题】:What is the best way to detect if an image is pixelated?检测图像是否像素化的最佳方法是什么?
【发布时间】:2020-09-07 08:42:28
【问题描述】:

我试图判断图像是否像素化。我试图使用拉普拉斯方差方法来执行此操作,但我不确定它是否正常工作,因为使用我的代码返回的一个非常扭曲/像素化的图像具有非常高的 1011 方差:

import sys
import cv2
import imutils as im

csv_filename = sys.argv[1]

def variance_of_laplacian(image):
    # compute the Laplacian of the image and then return the focus
    # measure, which is simply the variance of the Laplacian
    # image = cv2.copyMakeBorder(image, 100, 100, 100, 100, cv2.BORDER_CONSTANT, value = [255, 255, 255])
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        # invert gray image
    gray = 255 - gray
    # cv2.imshow("result", gray)
    # cv2.waitKey(0)
    laplacian_var = cv2.Laplacian(gray, cv2.CV_64F).var()
    return laplacian_var

image = im.url_to_image(sys.argv[1])
laplacian_var = variance_of_laplacian(image)
print laplacian_var

是否有其他方法可以检测图像中的像素化或类似情况?

这是一张我认为在我的测试中像素化/扭曲/模糊的图像:

【问题讨论】:

  • .var() 来自哪里?
  • 这看起来确实不是一个可以回答的问题,至少在您期望的图像类型没有更多限制的情况下并非如此。 “扭曲”和“像素化”是什么意思?例如,对于完美棋盘和“扭曲”的图像,拉普拉斯算子可能同样高。
  • @fmw42 我不确定。我使用这个site 作为拉普拉斯部分的参考。
  • @bnaecker 我将拥有的图像类型是产品图像。意味着白色背景,然后是中心的单个产品(至少理想情况下)。所以在我的例子中,一个像素化的图像将是一罐蛋黄酱,它被调整得更大,从而使文本和其他区域看起来粗糙和扭曲。对不起,如果我没有很好地解释它。
  • 你能提供你的源图片吗?

标签: python opencv python-2.x


【解决方案1】:

我认为您的问题与“.var()”有关。我不知道那是什么。但这是使用 numpy.var() 做你想做的事情的一种方法。

但请注意,除非您知道自己拥有相同的图像,否则拉普拉斯方差并不是测试像素化的好方法。

原始输入:

像素化输入:

import cv2
import numpy as np

# read original and pixelated image
img1 = cv2.imread('mandril3.jpg')
img2 = cv2.imread('mandril3_pixelated.png')

# convert to grayscale
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)

# compute laplacians
laplacian1 = cv2.Laplacian(gray1,cv2.CV_64F)
laplacian2 = cv2.Laplacian(gray2,cv2.CV_64F)

# get variances
variance1 = np.var(laplacian1)
variance2 = np.var(laplacian2)
print ('variance of original image:', variance1)
print ('variance of pixelated image:', variance2)

# save images
cv2.imwrite('mandril3_laplacian.png', (255*laplacian1).clip(0,255).astype(np.uint8))
cv2.imwrite('mandril3_pixelated_laplacian.png', (255*laplacian2).clip(0,255).astype(np.uint8))

# show laplacian using OpenCV
cv2.imshow("laplacian1", laplacian1)
cv2.imshow("laplacian2", laplacian2)
cv2.waitKey(0)
cv2.destroyAllWindows()


原始图像的拉普拉斯算子:

像素化图像的拉普拉斯算子:

差异结果:

variance of original image: 4014.7300553284585
variance of pixelated image: 779.2810668945312


【讨论】:

    【解决方案2】:

    这是判断图像是否像素化的一种方法。以相同的跳跃因子在两个不同的偏移量处抽取它,并计算绝对差的平均值。如果均值为零,则它是像素化的。

    在下文中,我使用 2 的跳跃和 0 和 1 的偏移。

    原图:

    像素化图像:

    import cv2
    import numpy as np
    
    # read original and pixelated image
    img1 = cv2.imread('mandril3.jpg')
    img2 = cv2.imread('mandril3_pixelated.png')
    
    # decimate images by some skip factor (2) for two different offsets (0 and 1)
    dec1A = img1[::2, ::2]
    dec1B = img1[1::2, 1::2]
    dec2A = img2[::2, ::2]
    dec2B = img2[1::2, 1::2]
    
    # get mean of absolute difference
    diff1 = cv2.absdiff(dec1A, dec1B)
    mean1 = np.mean(diff1)
    diff2 = cv2.absdiff(dec2A, dec2B)
    mean2 = np.mean(diff2)
    print('mean absdiff original image:', mean1)
    print('mean absdiff pixelated image:', mean2)
    
    # convert to grayscale
    gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
    gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
    


    平均结果:

    mean absdiff original image: 20.53973388671875
    mean absdiff pixelated image: 0.0
    


    【讨论】:

    • 所以这只有在我知道我有相同的图像时才有效,对吗?在我的情况下,会有很多不同的图像,所以我不能真正做一个基线来比较它。我想这个问题比我最初想象的要困难得多。我只是希望有一种方法可以让我知道传入的图像是否模糊/像素化/失真,而无需手动检查。
    • 我在下面描述的像素化测试不适用于测试是否模糊或扭曲。无法知道图像是否在几何意义上失真。也没有很好的方法来判断是否模糊。模糊测量是方差或标准偏差,但又与原始测量值进行比较。两张完全不同的图像都不会是模糊的,但其中一张的方差可能比另一张低得多,这仅仅是因为一张具有恒定颜色的大区域。可以按照我在下面的描述来测量像素化。
    • 所以你是说基本上不可能做我想做的事?您还能想到什么其他方法可以在没有参考图像的情况下将图像标记为清晰或像素化/失真/模糊?还是我只是运气不好?
    • 可以检测到像素化,如下所示。但我不知道任何随机图像是否扭曲或模糊。可以检测某些类型的模糊,例如运动模糊和散焦。但这些通常需要相当理想的情况。
    • 我明白了。那是不幸的。那我得继续找了。
    【解决方案3】:

    如果我们对您的图像应用 FFT,我们会看到 lins,不是很明显但可见:

    标记在这里:

    您可以计算沿 X 和 Y 轴的直方图,并找出是否有尖峰。如果派克高于定义的阈值,则您有像素化图像。

    您可以使用应用程序进行快速实验:http://www.jcrystal.com/products/ftlse/index.htm

    【讨论】:

    • 问题不在于生成像素化图像,而是如何检测图像是否被像素化。
    • 对不起,我的错。改变了我的答案。
    • FFT 直方图中的尖峰可能仅仅是由于其他影响或来自网格或棋盘的图像。所以这些并不是真正意义上的像素化​​。
    • 是的,但棋盘格是像素化图像的变体。是的,有特殊情况(任何常规结构)。但是任何检测像素化的方法都会检测到规律性,所以这似乎是一个普遍的问题。但是您可以通过设置有效的频率范围来减少副作用。
    • 同意。总而言之,您可以检测到最合理的情况,但会出现重复图案的图像的误报。
    猜你喜欢
    • 2013-01-03
    • 2013-05-08
    • 1970-01-01
    • 2013-02-01
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2014-01-04
    • 2023-03-18
    相关资源
    最近更新 更多