【问题标题】:How to separate the photoshopped part from the rest of the image if the original image is given?如果给出原始图像,如何将经过照片处理的部分与图像的其余部分分开?
【发布时间】:2019-04-14 04:16:55
【问题描述】:

我正在开展一个检测拼接(photoshopped)图像的项目,并希望在伪造区域的边界处使用 128x128 补丁。我有真实的背景图片和伪造的。

如果我只是发现像素值的差异并应用阈值来获取二进制图像,我会得到很多噪声(白色部分中的小黑块,反之亦然),cv2.medianBlur() 无法有效去除这些噪声. 我假设这是因为拼接前后图像的压缩系数不同。此外,拼接部分中的某些像素与 auth 中的相应像素相似。图片。

所以我替换了普通的 cv2.threshold() 函数,该函数将像素的 4 连接邻居的值相加,并将其与阈值进行比较。

这是我的阈值函数:

def threshold(image,thresh):
    b,g,r= cv2.split(image)
    res=np.zeros(b.shape,dtype=np.uint8)

    #Not considering boundary pixels for the binary image
    for i in range(1,b.shape[0]-1):
        for j in range(1,b.shape[1]-1):
            sumb = b[i][j] + b[i+1][j] + b[i-1][j] + b[i][j+1] + b[i][j-1] 
            sumg = g[i][j] + g[i+1][j] + g[i-1][j] + g[i][j+1] + g[i][j-1] 
            sumr = r[i][j] + r[i+1][j] + r[i-1][j] + r[i][j+1] + r[i][j-1] 

            res[i][j]=255 if sumb<=5*thresh or sumg<=5*thresh or sumr<=5*thresh else 0

    res=res[1:-1,1:-1]
    res=cv2.copyMakeBorder(res,1,1,1,1,cv2.BORDER_REFLECT_101)
    return res

这确实提供了更好的结果,但不如预期的那么好。

例如,这是一张真实的图片:

这是拼接好的图片:

这是阈值图像(我发现thresh=2 是最佳值):

我尝试通过使用connectedComponentsWithStats() 移除具有少量白色像素的组件来移除小组件。

这些是移除小的连接组件后的边框:

而预期的图像是:

我可以增加每个组件所需的最小像素数,但我的数据集中有些图像的伪造部分很小。

我怎样才能得到比这更好的结果?

另外,是否可以优化我的threshold 功能?现在处理一张图像至少需要 2 秒!

【问题讨论】:

标签: python numpy opencv image-processing


【解决方案1】:

[我现在没有在我的计算机上安装 OpenCV,所以改为在 MATLAB 中查看您的图像。下面的 Python 代码未经测试。]

由于您的图像是相同的,除非进行了有目的的更改(没有考虑缩放或平移),因此可以简单地将两个图像相减并查看差异:

res = cv2.absdiff(image,thresh)

如果你显示这个(带有一些对比度拉伸),你会看到:

如您所见,至少有一个通道在“拼接”区域有很大的差异,在它之外这里有一些非常轻的点,由有损压缩引起。

让我们为每个像素取 R、G、B 的最大值:

res = np.amax(res, axis=2)   # (I think OpenCV stores the channels in the 3rd dimension?)

我发现大多数压缩伪影都低于 15,所以让我们在那里设置阈值:

res = res > 15

最后,应用您的cv2.medianBlur() 来消除最后一点噪音。您也可以尝试在阈值之前应用GaussianBlur()

【讨论】:

  • 你的 3 行代码就像魔术一样工作!我以一种非常非 Python 的方式尝试了同样的事情 - 检查每个像素的每个通道值是否大于 15(使用嵌套的 for 循环)。我不认为我得到了相同的输出。可能我的逻辑有些错误。非常感谢!
  • 部分图片只改变了天空背景仍然存在问题。在这些情况下,绝对差异并不大。如何考虑相邻像素以使其更好而无需再次循环?
  • @AbdulMuizz:您使用过滤器考虑相邻像素。我建议GaussianBlur,然后你可能可以降低门槛。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-08
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
相关资源
最近更新 更多