OpenCV与Python之图像基础操作
1. 导入opencv包
import cv2
2. 读取图像
命令:img = cv2.imread('图片路径', 读取方式)
读取方式:cv2.IMREAD_UNCHANGED(不改变图像形式),cv2.IMREAD_GRAYSCALE(以灰度形式读取图像),cv2.IMREAD_COLOR(以彩色形式读取图像)
img = cv2.imread('images/cat_color.jpg', cv2.IMREAD_GRAYSCALE)
3. 显示图像
命令:cv2.imshow('窗口名字', img)
为了让图像一直显示而不一闪而过,要加上cv2.waitKey(),为了关掉窗口就清空内存,要加上cv2.destroyAllWindows()
cv2.imshow('Lena', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
4. 保存图像
命令:cv2.imwrite('图片路径', img)
cv2.imwrite('images/cat.tif', img)
5. 读取和修改像素
1)类似于numpy中的数组操作一样,访问或修改单个像素只需指定像素在数组中的位置即可,例如:pixel = [100, 100];访问和修改一定区域内的多个像素只需指定数组范围就行,例如:pixels = [50:100, 50:100]
2)可以使用numpy中提供的item(),访问像素,例如:pixel = img.item(100, 100);使用itemset(),修改像素值,例如:img.itemset((100, 100), 255)
pixel = img[100, 100]
pixels = img[50:100, 50:100]
pixel = img.item(100, 100)
img.itemset((100, 100), 255)
6. 图像属性
1)图像宽度和高度:shape
2)图像像素数量:size
3)图像类型:dtype
m,n,_ = img.shape
# shape返回一个元组,如果图像是灰度图像,返回(宽度, 高度)
# 如果图像是彩色图像,返回(宽度,高度,3)
pixelSize = img.size
# 返回图像像素数量, size = m * n
pixelDtype = img.dtype
# 图像类型一般是uint8
7. 图像通道拆分与合并
1)拆分:cv2.split,一般的操作是将一副彩色图像的b, g, r三个通道分离开来,注意在opencv中,彩色图像的通道是b, g, r,而不是r, g, b,例如:b, g, r = cv2.split(img)
2)合并:cv2.merge,一般的操作是将三个通道合并成一个彩色图像,例如:img = cv2.merge([b, g, r]),合并中可以将彩色图像中的某一通道与两个零通道合并而得到蓝色,绿色,红色图像
b, g, r = cv2.split(img)
zeros = np.zeros((m,n), dtype=np.uint8)
img1 = cv2.merge([b, zeros, zeros])
img2 = cv2.merge([zeros, g, zeros])
img3 = cv2.merge([zeros, zeros, r])
8. 图像加法运算
1)使用img = cv2.add(img1, img2),两副图像相加,很有可能出现像素值超过255的情况,cv2.add会自动将超过255的值变为255
2)使用numpy中的加法img = img1 + img2,这种加法不会像cv2.add中的那样,自动将超过255的像素值变为255,它进行的是一种取模运算,简单来讲就是因为图像类型一般是uint8类型,最大值不能超过255,对于超过255的值,该类型会进行取模运算,就是取除以255的余数;为了避免这种情况出现,我们一般在对图像进行运算之前(不仅仅是加法运算,还有其他的减法,小于0的情况,乘法等等),我们要先将图像的类型转换成int32或者float类型:img = img.astype(np.float),加法结束后再对图像进行归一化处理,将图像像素范围调整到0到1之间(或者0到255之间的整数)
img1 = cv2.add(img, img)
img2 = img + img
img = img.astype(np.int32) # 对原始图像类型进行转换
img3 = img + img
# 归一化处理
def norm(img):
img = img - np.min(img)
img = img / np.max(img)
return img
img3 = norm(img3)
img3 = img3 * 255 # 必须将图像范围改到0到255后再使用np.uint8
img3 = img3.astype(np.uint8) # uint8 只是简单的
9. 图像融合
img3 = cv2.addWeighted(img1, weight1, img2, weight2, light), 将两张图像按一定的比例叠加在一起
assert img1.shape == img2.shape
img3 = cv2.addWeighted(img1, 0.8, img2, 0.2, 0)
# 0.8指img1占的比重,0.2指img2占的比重, 0指不改变图像亮度
10. 图像类型转换
命令:img2 = cv2.cvtColor(img, 转换格式)
常用转换格式:cv2.COLOR_BGR2GRAY(彩色转灰度), cv2.COLOR_BGR2RGB(BGR转RGB), cv2.COLOR_GRAY2BGR(灰度转彩色)
img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
11. 图像缩放
命令:img2 = cv2.resize(img, (宽度,高度),fx=宽度缩放倍数,fy=高度缩放倍数)
img2 = cv2.resize(img, (200, 200))
img3 = cv2.resize(img, None, fx=1, fy=2)
12. 图像翻转
命令:img2 = cv2.flip(img, 翻转方式)
翻转方式:0:x轴翻转;> 0:y轴翻转;< 0:x,y均翻转一次,即对角线翻转
img2 = cv2.flip(img, -1)