一.Opencv基本操作
(1)图像读取保存
1.1读取图像
cv.imread(‘name.jpg’,flag)
flags:读入图片的标志
cv.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道,可以直接写1
cv.IMREAD_GRAYSCALE:读入灰度图片,可以直接写0
cv.IMREAD_UNCHANGED:读入完整图片,包括alpha通道,可以直接写-1
1.2显示图像
<1>cv.imshow(‘name’,img)
参数:显示图像的窗口名称,字符串类型
要加载的图像
在调用后,要调用cv.waitKey()给图像绘制留下时间,否则窗口会出现无响应情况,并且图像也无法加载出来。cv.waitKey(0):永远的等待下去。
<2>
plt.imshow(img[:,:,::-1]) (原来BGR换成RGB通道,翻转一下)
plt.show()
1.3保存图像
cv.imwrite(‘name.png’,img)
参数:文件名
要保存的图像
(2)绘制几何图形
2.1直线
cv.line(img,start,end,color,thickness)
img:要绘制直线的图像
start,end :直线起始点
color:直线颜色
thickness:线条宽度
2.2 圆形
cv.circle(img,centerpoint,r,color,thickness)
2.3矩形
cv.retangle(img,leftupper,rightdown,color,thickness)
2.4 添加文字
cv.putText(img,text,station,font,fontsize,color,thickness,cv.LINE_AA)
(3)访问图像的像素
通过行列坐标获取,对于BGR图像,返回一个蓝绿红值得数组;对于灰度图像,仅返回相应的强度值。
获取:px = img[100,100]
仅获取蓝色强度值:blue = img[100,100,0]
修改:img[100,100]=[255,255,255]
(4)获取图像属性
形状:img.shape
图像大小:img.size
数据类型:img.dtype
(5)通道的分离和合并
b, g, r = cv.split(img)
img = cv.merge((b,g,r))
(6)颜色空间的变换
cv.cvtColor(input_image, flag)
Flag:转换类型
Cv.COLOR_BGR2GRAY
Cv.COLOR_BGR2HSV
二.算数操作
(1)加减乘除
两图相同大小和类型,或者第二个图像可以是标量值。
cv.add():饱和操作
numpy:res = img1+img2 :模运算
x = np.uint8([250])
y = np.uint8([10])
print(cv.add(x, y))
#[[255]] 250+10=260 ==> 255 (结果更好)
print(x+y)
#[4] 250+10 = 260 % 256 = 4
print(cv.subtract(y, x))
#[[0]] 10-250=-240 <0 ==>0
print(y-x)
#[16] -240 = 256 * 1 +(-16) ==> 16
print(cv.multiply(y, x)) # [[255]]
print(x*y)
#[196] 2500%256 == 196
print(cv.divide(x, y)) # [[25]]
print(x/y) # [25.]
(2)图像混合
两幅图像给予不同权重的混合
g(x) = (1-ɑ) f0(x) +ɑf1(x)
dst = αimg1 + βimg2 + γ
例: 0.7 0.3 0
代码演示
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1读取图像
img = cv.imread("image./sky.jpg")
moppet = cv.imread("image./moppet.jpg")
night = cv.imread("image./night.jpg")
# # 2 显示图像
# # 2.1opencv
# cv.imshow("image", img)
# k = cv.waitKey(0)
# cv.destroyAllWindows()
# #2.2 matplotlib
# #plt.imshow(img[:, :, ::-1])
# plt.imshow(img,cmap=plt.cm.gray)
# plt.title("moon"), plt.xticks([]), plt.yticks([])
# plt.show()
# 3图像保存
# cv.imwrite("messigray.png", img)
# # 4.绘制图形
# img = np.zeros((512, 512, 3), np.uint8)
# # 无符号整型
#
# cv.line(img, (0, 0), (511, 511), (255, 0, 0), 5)
# cv.rectangle(img, (384, 0), (510, 128), (0, 255, 0), 3)
# cv.circle(img, (447, 63), 63, (0, 0, 255), -1)
# font = cv.FONT_HERSHEY_SIMPLEX
# cv.putText(img, "opencv", (10, 500), font, 4,(255, 255, 255), 2, cv.LINE_AA)
# plt.imshow(img[:, :, ::-1])
# plt.title("draw"), plt.xticks([]), plt.yticks([])
# plt.show()
# # 5.像素
# img[100, 120] = [255, 255, 255]
# img[100, 121] = [255, 255, 255]
# px = img[100, 100]
# print(px)
# # 6.属性
# print(img.shape)
# # 7.通道拆分与合并
# b, g, r = cv.split(img)
# plt.imshow(b, cmap=plt.cm.gray)
# plt.show()
# img2 = cv.merge((b, g, r))
# plt.imshow(img2[:, :, ::-1])
# plt.show()
# 8.空间转换
# gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# plt.imshow(gray, cmap=plt.cm.gray)
# plt.show()
# hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
# plt.imshow(hsv)
# plt.show()
# # +
# img1 = cv.add(img, night)
# cv.namedWindow("image", cv.WINDOW_NORMAL)
# cv.imshow("image", img1)
# k = cv.waitKey(0)
# cv.destroyAllWindows()
#
# img2 = img + night
# plt.imshow(img2[:, :, ::-1])
# plt.title("add"), plt.xticks([]), plt.yticks([])
# plt.show()
# # -
# img1 = cv.subtract(img, night)
# cv.namedWindow("image", cv.WINDOW_NORMAL)
# cv.imshow("image", img1)
# k = cv.waitKey(0)
# cv.destroyAllWindows()
#
# img2 = img - night
# plt.imshow(img2[:, :, ::-1])
# plt.title("add"), plt.xticks([]), plt.yticks([])
# plt.show()
# # *
# img1 = cv.multiply(img, night)
# cv.namedWindow("image", cv.WINDOW_NORMAL)
# cv.imshow("image", img1)
# k = cv.waitKey(0)
# cv.destroyAllWindows()
#
# img2 = img * night
# plt.imshow(img2[:, :, ::-1])
# plt.title("add"), plt.xticks([]), plt.yticks([])
# plt.show()
# img1 = cv.divide(img, night)
# cv.namedWindow("image", cv.WINDOW_NORMAL)
# cv.imshow("image", img1)
# k = cv.waitKey(0)
# cv.destroyAllWindows()
#
# img2 = img / night
# plt.imshow(img2[:, :, ::-1])
# plt.title("add"), plt.xticks([]), plt.yticks([])
# plt.show()
# x = np.uint8([250])
# y = np.uint8([10])
# print(cv.add(x, y))
# print(x+y)
# print(cv.subtract(y, x))
# print(y-x)
# print(cv.multiply(y, x))
# print(x*y)
# print(cv.divide(x, y))
# print(x/y)
# # 图像混合
# img3 = cv.addWeighted(img, 0.7, moppet, 0.3, 0)
# plt.imshow(img3[:, :, ::-1])
# plt.title("add"), plt.xticks([]), plt.yticks([])
# plt.show()