Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将裁剪后的图像与opencv进行比较_Python_Opencv_Roi - Fatal编程技术网

Python 将裁剪后的图像与opencv进行比较

Python 将裁剪后的图像与opencv进行比较,python,opencv,roi,Python,Opencv,Roi,我想比较两幅图像以检查它们是否相等,但为此我需要比较两幅图像的特定区域(ROI)。 我已经裁剪了我想要比较的区域,但现在我想知道如何才能完成这个过程,因为我不能直接比较裁剪后的图像。 例如,如何获得两个裁剪图像的平均像素值并进行比较 更新:我已经解决了这个问题。 当前代码: import cv2 import numpy as np from skimage.measure import compare_ssim as ssim def mse(imageA, imageB): #

我想比较两幅图像以检查它们是否相等,但为此我需要比较两幅图像的特定区域(ROI)。 我已经裁剪了我想要比较的区域,但现在我想知道如何才能完成这个过程,因为我不能直接比较裁剪后的图像。 例如,如何获得两个裁剪图像的平均像素值并进行比较

更新:我已经解决了这个问题。 当前代码:

import cv2
import numpy as np
from skimage.measure import compare_ssim as ssim


def mse(imageA, imageB):
    # the 'Mean Squared Error' between the two images is the sum of the squared difference between the two images;
    err = np.sum((imageA.astype("float") - imageB.astype("float")) ** 2) 
    err /= float(imageA.shape[0] * imageA.shape[1])


polarity_ok = cv2.resize(cv2.imread("polarity_OK_edited.jpg"),None,fx=0.2, fy=0.2) #resize the image to be smaller
polarity_nok = cv2.resize(cv2.imread("Polarity_NOK1.JPG"), None,fx=0.2, fy=0.2) #resize the image to be smaller

polarity_ok_cropped = polarity_ok[350:408, 97:111]
polarity_nok_cropped = polarity_nok[350:408, 97:111]

polarity_ok_cropped1 = polarity_ok[359:409, 232:240]
polarity_nok_cropped1 = polarity_nok[359:409, 232:240]

polarity_ok_cropped2 = polarity_ok[118:153, 44:69]
polarity_nok_cropped2 = polarity_nok[118:153, 44:69]

polarity_ok_cropped3 = polarity_ok[94:142, 192:197]
polarity_nok_cropped3 = polarity_nok[94:142, 192:197]

m = mse(polarity_ok_cropped, polarity_nok_cropped)
s = ssim(polarity_ok_cropped, polarity_nok_cropped, multichannel=True)

diff = cv2.subtract(polarity_ok_cropped, polarity_nok_cropped)
result = not np.any(diff)

m1 = mse(polarity_ok_cropped1, polarity_nok_cropped1)
s1 = ssim(polarity_ok_cropped1, polarity_nok_cropped1, multichannel=True)

diff1 = cv2.subtract(polarity_ok_cropped1, polarity_nok_cropped1)
result1 = not np.any(diff1)

m2 = mse(polarity_ok_cropped2, polarity_nok_cropped2)
s2 = ssim(polarity_ok_cropped2, polarity_nok_cropped2, multichannel=True)

diff2 = cv2.subtract(polarity_ok_cropped2, polarity_nok_cropped2)
result2 = not np.any(diff2)

m3 = mse(polarity_ok_cropped2, polarity_nok_cropped2)
s3 = ssim(polarity_ok_cropped2, polarity_nok_cropped2, multichannel=True)

diff3 = cv2.subtract(polarity_ok_cropped3, polarity_nok_cropped3)
result3 = not np.any(diff3)


if (result and result1 and result2 and result3):
    print ("The polarity is correct. Awesome :)")
else:
    print ("Nice try, but the polarity is incorrect. Take another chance!")

您可以使用结构相似性指数(SSIM)作为输入,并返回[-1,1]范围内的分数值。分数为1表示两个输入图像之间完全相似(如果两个图像相等)


顺便说一句,最好将比较前的输入图像转换为灰度。

如果您确切知道要比较的对象的位置,使用OpenCV比较两幅图像的简单而快速的方法是使用
calcHistogram()
为每个通道(RGB或HSV)提取直方图,然后使用
compareHist()进行比较


更多信息和示例可在此处找到:

还有一种方法可以做到这一点:

从PIL导入图像
输入数学,运算符
i1=Image.open('./image1.png')
i2=Image.open('./image2.png')
#这将调整图像文件的任何格式
断言i1.mode==i2.mode,“不同类型的图像”
断言i1.size==i2.size,“不同的大小。”
pairs=zip(i1.getdata(),i2.getdata())
如果len(i1.getbands())==1:
#用于灰度JPEG
dif=总和(p1的abs(p1-p2),p2成对)
其他:
dif=总和(p1的abs(c1-c2),c1的p2成对,拉链中的c2(p1,p2))
ncomponents=i1.大小[0]*i1.大小[1]*3

打印(“差异(百分比):”,(dif/255.0*100)/ncomponents)
谢谢您的回答。但是当我尝试使用skimage时,我得到了以下错误:“ModuleNotFoundError:没有名为'scipy'的模块”您可以简单地在cmd上执行
pip install scipy stack
(取决于您使用的环境)
from skimage.measure import compare_ssim
(score, diff) = compare_ssim(image1, image2, full=True)