这篇文章上次修改于 248 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
数值计算
在图像处理过程中,经常需要对图像进行加法运算,这时候使用符号“+”,或者函数cv2.add皆可。
对于使用“+”进行数值计算时,应当遵循如下定律:
若想要增加图像的整体亮度,可以将每个像素值加上一个特定的值
比如我们引入一张猫的图,对其整体数组进行+50操作:
img_cat=cv2.imread('cat.jpg')
img_cat2= img_cat +50
img_cat[:5,:,0]
我们查看特定部分单一通道的原始数值:
array([[142, 146, 151, ..., 156, 155, 154],
[107, 112, 117, ..., 155, 154, 153],
[108, 112, 118, ..., 154, 153, 152],
[139, 143, 148, ..., 156, 155, 154],
[153, 158, 163, ..., 160, 159, 158]], dtype=uint8)
再来查看+50操作后的值:
img_cat2[:5,:,0]
array([[192, 196, 201, ..., 206, 205, 204],
[157, 162, 167, ..., 205, 204, 203],
[158, 162, 168, ..., 204, 203, 202],
[189, 193, 198, ..., 206, 205, 204],
[203, 208, 213, ..., 210, 209, 208]], dtype=uint8)
可以很明显的看到,所有的数组值都被+50操作,反映到图像上就是图片整体变亮了。
不过根据前面所说的定律,当a+b的值>255时,输出的值为mod(a+b)%256,因此,原本过白的地方反而会变黑,从而影响整体效果:
对于使用cv2.add函数而言,所得到的结果与使用符号“+”有所不同:
例如,将前面的cat和cat2两个图像通过add函数相互叠加,则输出结果:
cv2.add(img_cat,img_cat2)[:5,:,0]
array([[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255],
[255, 255, 255, ..., 255, 255, 255]], dtype=uint8)
可以看到,此时的输出结果取了最大值。
让我们来做一个更鲜明的比较:
import cv2
a=cv2.imread("lena.jpg",0)
b=a
result1=a+b
result2=cv2.add(a,b)
cv2.imshow("original",a)
cv2.imshow("result1",result1)
cv2.imshow("result2",result2)
cv2.waitKey()
cv2.destroyAllWindows()
从左到右依次是原图,使用符号叠加图和函数叠加图,输出的结果与前面所解释的相同。
图像融合
图像融合,顾名思义,可以将两张图像融合成为一张图像,融合的图像兼具二者的特征:
现在尝试融合猫和狗的照片:
img_cat + img_dog
到这里报错了,报错信息是:
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-54-e8802e660946> in <module>
----> 1 img_cat + img_dog
ValueError: operands could not be broadcast together with shapes (414,500,3) (429,499,3)
大概的意思是进行融合的两张图像,其x轴和y轴的大小,以及通道数必须完全一致,否着会导致融合错误。
因此,需要对其中一张照片进行调整,使其x轴和y轴的大小与另一张图片等同。
这里我对狗的图像进行调整:
img_dog = cv2.resize(img_dog, (500, 414))#y,x
img_dog.shape
此时,该图像的输出结果为:(414, 500, 3)
完成这一步,就可以对图像进行融合操作了:
res = cv2.addWeighted(img_cat, 0.5, img_dog, 0.5, 0)
图像翻转
#在 OpenCV 中,图像的翻转采用函数 cv2.flip()实现,该函数能够实现图像在
#水平方向翻转、垂直方向翻转、 两个方向同时翻转,
import cv2
img=cv2.imread("lena.jpg")
x=cv2.flip(img,0)#绕着 x 轴翻转
y=cv2.flip(img,1)#绕着 y轴翻转
xy=cv2.flip(img,-1)#绕着x, y轴翻转
cv2.imshow("img",img)
cv2.imshow("x",x)
cv2.imshow("y",y)
cv2.imshow("xy",xy)
cv2.waitKey()
cv2.destroyAllWindows()
没有评论