[英]How to get the MSE of each pixel in two images of the same dimension
我有两个尺寸相同的图像。
图像是numpy数组,我正在迭代像素并获取每个像素的r
g
b
,如下所示:
for i in range(len(img1)):
for j in range(len(img1[0])):
pimg1 = img1[i][j]
pimg2 = img2[i][j]
r1 = pimg1[0]
r2 = pimg2[0]
g1 = pimg1[1]
g2 = pimg2[1]
b1 = pimg1[2]
b2 = pimg2[2]
然后我获得两个像素之间的MSE,如:
mse = math.sqrt(((r1 - r2) ** 2) + ((g1 - g2) ** 2) + ((b1 - b2) ** 2))
问题是这是非常缓慢的。 有没有更有效的方法来做到这一点?
我希望在两个图像之间制作具有某种“阈值”相似性的所有像素,黑色。 并且所有与img2
的像素差异较大的像素。
if mse > threshold:
new_img[i][j] = pimg2
else:
new_img[i][j] = [0, 0, 0] # black pixel
我正在捕捉像这样的图像:
for frame in cam.camera.capture_continuous(raw, format="rgb", use_video_port=True):
img = frame.array
cv2.imwrite("image.png", img)
我得到的图像如下:
dir = 'images/compare/'
bg = cv2.imread(dir+'bg.png')
img = cv2.imread(dir+'in.png')
只需在差异上使用np.linalg.norm
-
mse = np.linalg.norm(img1-img2,axis=2)
用np.einsum
加快速度 -
d = (img1-img2).astype(float)
mse = np.sqrt(np.einsum('...i,...i->...',d,d))
运行时测试 -
In [46]: np.random.seed(0)
...: m,n = 1024,1024
...: img1 = np.random.randint(0,255,(m,n,3)).astype(np.uint8)
...: img2 = np.random.randint(0,255,(m,n,3)).astype(np.uint8)
In [47]: %timeit np.linalg.norm(img1-img2,axis=2)
10 loops, best of 3: 26.6 ms per loop
In [49]: %%timeit
...: d = (img1-img2).astype(float)
...: mse = np.sqrt(np.einsum('...i,...i->...',d,d))
100 loops, best of 3: 13 ms per loop
要为MSE
值小于某个阈值mse_thresh
像素创建一个设置为black
的输出数组,否则从img2
选择,这里是附加代码 -
mask = mse >= mse_thresh
out = np.where(mask[...,None], img2, 0)
将所有内容拼接在一起 - 使用einsum
计算平方的MSE
值,并与主要改进的平方MSE阈值进行比较,并将输出分配回img2
-
d = (img1-img2).astype(float)
mse = np.einsum('...i,...i->...',d,d)
img2[mse < mse_thresh**2] = 0
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.