求助 python 如何实现对两张同尺寸图片进行对比,找出像素差异?

2015-05-29 13:53:33 +08:00
 doomgiant
比如这两张图片





尺寸一样, 能否找出 差异的像素数量,就是 'diff' 所占用的像素数?

尝试PIL 和 OPENCV,但是都没法实现对像素的控制,不想做伸手党,但是研究了很久没有进展,上来请教下大家。
14518 次点击
所在节点    问与答
20 条回复
kslr
2015-05-29 13:55:20 +08:00
还记得字模识别的验证码的么?行不行
yahoo21cn
2015-05-29 13:57:02 +08:00
转成bmp,像素求差集行吗
chengzhoukun
2015-05-29 13:58:54 +08:00
图片说到底是矩阵,转化成矩阵然后对比不同矩阵元素是不是好点
lzachilles
2015-05-29 14:02:48 +08:00
为什么OPENCV不行?imread进来就是Mat矩阵,每个元素就是一个像素。直接两个Mat相减就OK了
Septembers
2015-05-29 14:07:57 +08:00
theFool
2015-05-29 14:13:10 +08:00
为什么我在网页(chrome)上看的感觉下面的图比较亮,下到本地看是一样的?
doomgiant
2015-05-29 14:21:07 +08:00
多谢各位指点,我从矩阵这块在研究看看。再次感谢
doomgiant
2015-05-29 14:21:57 +08:00
@theFool 是不是tn屏幕,光显不均匀
theFool
2015-05-29 14:24:00 +08:00
@doomgiant 原来如此,确实是tn屏。
Sylv
2015-05-29 15:07:30 +08:00
PIL 怎么会不可以呢,我试了下分分钟搞定:

from PIL import Image
im1, im2 = Image.open("1.jpg"), Image.open("2.jpg")
width, height = im1.size
diff = [(x, y) for x in xrange(width) for y in xrange(height) if im1.getpixel((x, y)) != im2.getpixel((x, y))]
print len(diff)

-> 532
Sylv
2015-05-29 15:34:30 +08:00

把有差异的点 draw 出来可以发现,像素不同的不单单是 'diff' 所占用的像素,周围像素也有不同。应该是因为 JPEG 是有损压缩图片格式,周围像素信息被丢失了。
doomgiant
2015-05-29 16:06:44 +08:00
@Sylv 非常感谢,新手上路 :)

尝试用opencv2

###
import numpy as np
import cv2
global n
n = 0
img1 = cv2.imread('testimg.jpg', 0)
img2 = cv2.imread('testimg_diff.jpg', 0)
height, width = img1.shape
for line in range(height):
for pixel in range(width):
if img1[line][pixel] != img2[line][pixel]:
n = n + 1
print n
###

-> 299

奇怪得出的值和你的不太一样,继续研究研究
doomgiant
2015-05-29 16:12:31 +08:00
重新排版

###
import numpy as np
import cv2
global n
n = 0
img1 = cv2.imread('testimg.jpg', 0)
img2 = cv2.imread('testimg_diff.jpg', 0)
height, width = img1.shape
for line in range(height):
for pixel in range(width):
if img1[line][pixel] != img2[line][pixel]:
n = n + 1
print n
###
doomgiant
2015-05-29 16:16:41 +08:00
timi
2015-05-29 16:23:56 +08:00
读入到矩阵,然后矩阵相减。
doomgiant
2015-05-29 16:31:29 +08:00
@Sylv 发现问题了,我载入的时候直接灰阶了,所以值少了好多,再次感谢
dobest
2015-05-30 08:23:21 +08:00
直接遍历最简单,上面已经有人说了。另外,可以用opencv的absdiff函数,直接得到差值图像,这样可以看到两幅图像的差异。计算差异像素个数,可以将差值图像转成灰度后,用countNonZero计算非零像素个数。
Harry
2017-07-07 23:15:45 +08:00
@Sylv 因为 opencv 查到了这里。我也有一个 opencv 的 “疑难杂症” 愿意付费请教。微信 ID: luhe1987 ;
Sylv
2017-07-08 12:36:58 +08:00
@Harry 不好意思,我对 opencv 不太熟悉,PIL 也很久没用了,恐不能胜任。
Harry
2017-07-09 21:24:17 +08:00
@Sylv 没问题,多谢回复。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/194662

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX