这几天使用opencv做一些图像处理的问题,进行到算术运算时就被卡住了,上网搜索总是不能解决我的问题。最后通过不断的尝试,终于得到解决!
报错提示:OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\highgui\src\window.cpp:967: error: (-215:Assertion failed) size.width>0 && size.height>0 in function 'cv::imshow'
或者是这样
OpenCV(4.6.0) D:\a\opencv-python\opencv-python\opencv\modules\core\src\arithm.cpp:650: error: (-209:Sizes of input arguments do not match) The operation is neither 'array op array' (where arrays have the same size and the same number of channels), nor 'array op scalar', nor 'scalar op array' in function 'cv::arithm_op'
错误原因:经过本人n次的调试,得到以下三种方案
一.文件读取路径不对
这是我们常常会遇到的问题,大家英文水平不太高,习惯使用中文作为文件夹的名称便于查找,但是opencv就不惯着,但凡有一点中文都会报错(当时没报错,不代表第n次运行后也如此)。下面这种格式就是很好的习惯了。
import cv2 as cv
import numpy as np
#读取图像
img = cv.imread("D:\jpg\lena.jpg",0)
cv.imshow("img",img)
cv.waitKey(0)
如果不行的话,我们可以尝试在路径里使用双斜杆“//”(绝对路径),反斜杠"\"(linux的路径)
二. 图像的大小或者格式不一致
这是我所遇到问题,首先我们读取图片的大小不一致的话,图片是无法融合的,因为图像的融合相当于是将矩阵内对应的像素值相加,如果像素值的个数都不相同的话,还如何进行融合呢?
解决办法:
import cv2 as cv import numpy as np img11=cv.imread("D:\lenargb.tif",1) img11 = cv.resize(img11, (400, 400), interpolation=cv.INTER_AREA)#调整图片大小 img12=cv.imread("D:\\photo\\txcl\\sleep.jpg",1) img12 = cv.resize(img12, (400, 400), interpolation=cv.INTER_AREA)#调整图片大小 add=cv.add(img11,img12)#加:实现图像融合 cv.imshow("w",add) cv.waitKey(0)
只要我们将添加这样一行代码:
将两张图片的大小调成一致就可以了。
cv.resize(img, (400, 400), interpolation=cv.INTER_AREA)
三.还有一种情况就是图片的格式不同,同理:
例如:假设图像1的数据类型为unit8,图像2的数据类型为float32,2个图像数据类型不一致时,add,subtract,multiply,divide等算术运算的返回图像又该是什么类型呢?
所以我们需要声明其数据类型。在算术运算add函数里面添加一个dtype参数,如下所示:
img = cv.add(img1,img2,dtype=cv2.CV_8UC3) #声明生成新的img的数据类型
有人会好奇,最后生成的图像又是什么类型的呢?
那么,我们可以使用:
img.dtype #查看img的类型
查看最终生成的图片是什么类型的啦!
小伙伴们也可以将过程中遇到的其他问题回复在评论区,我们一起讨论!
最后附上我的代码:
# 图像的基本运算加,减,逻辑运算 opencv 是大于255取255,numpy是取模
import cv2 as cv
image1=cv.imread("D:/opencv/lenargb.jpg",1)
image1 = cv.resize(image1, (400, 400), interpolation=cv.INTER_AREA)
image2=cv.imread("D:/opencv/\girl.jpg",1)
image2 = cv.resize(imgage2, (400, 400), interpolation=cv.INTER_AREA)
add=cv.add(image1,image2)#加法实现图像融合
sub=cv.subtract(image1,image2)#减法可实现图像目标运行的检测
cheng=cv.multiply(image1,image2)#乘法
chu=cv.divide(image1,image2)#除法可实现目标的位置判断
yu=cv.bitwise_and(image1,image2)#与运算
huo=cv.bitwise_or(image1,image2)#或运算
yihuo=cv.bitwise_xor(image1,image2)#异或运算
fei=cv.bitwise_not(image1)#非运算
#opencv在一个窗口显示多幅图像不方便
cv.imshow("image1",image1)
cv.imshow("image2",image2)
cv.imshow("add",add)
cv.imshow("sub",sub)
cv.imshow("yu",yu)
cv.imshow("huo",huo)
cv.imshow("yihuo",yihuo)
cv.imshow("fei",fei)
cv.waitKey(0)
cv.destroyAllWindows()
#matplotlib里显示多幅图像
import matplotlib.pyplot as plt
import cv2 as cv
add1=cv.cvtColor(add,cv.COLOR_BGR2RGB) #将bgr转换为rgb
sub1=sub[:,:,::-1]#将bgr转换为rgb
yu1=yu[:,:,::-1]
huo1=huo[:,:,::-1]
yihuo1=yihuo[:,:,::-1]
fei1=fei[:,:,::-1]
plt.figure()
# 解决中文显示问题
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.subplot(231);plt.imshow(add1);plt.title("add1")
plt.subplot(232);plt.imshow(sub1);plt.title("sub1")
plt.subplot(233);plt.imshow(yu1);plt.title("yu1")
plt.subplot(234);plt.imshow(huo1);plt.title("huo1")
plt.subplot(235);plt.imshow(yihuo1);plt.title("yihuo1")
plt.subplot(236);plt.imshow(fei1);plt.title("fei1")