Python-OpenCV的基本使用
Python-OpenCV环境的配置看上一篇OpenCV环境的配置
本篇主要介绍一下OpenCV的基本使用和相关函数的介绍。
以下所有操作都基于这三个库:
import cv2
import numpy as np
import matplotlib.pylab as plt
原图
文章目录
- Python-OpenCV的基本使用
* - 1、图像的读取
- 2、图像保存
- 3、图像展示
- 4、获取图像属性
- 5、图像缩放(宽,高)
- 6、在原图像中获取某一区域
- 7、彩色图像通道分解
- 8、图像加法
- 9、图像反转
- 10、图像金字塔
- 11、直方图
- 12、图像类型转换
- 13、图像阈值转换 、二值化
- 14、图像平滑处理
- 15、图像形态学操作
- 16、图像梯度,边缘检测
- 17、图像轮廓标注
- 18、读取视频文件
; 1、图像的读取
import cv2
img = cv2.imread('文件路径'[,cv2.IMREAD_UNCHANGED])
2、图像保存
import cv2
cv2.imwrite('image/gray_test.jpg',img)
3、图像展示
(1)使用OpenCV自带的显示函数
import cv2
cv2.imshow('显示窗口的名字',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''
cv2.waitKey(num)函数的参数介绍
num0 停滞num秒
'''
(2)使用matplotlib库实现
不能直接用matplotlib去显示opencv读取的图像,因为opencv读取的图像的通道顺序是[B,G,R],而matplotlib显示图像时图像的通道顺序是[R,G,B]。
解决办法
import cv2
img = cv2.imread('文件路径')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
显示图像
import cv2
matplotlib.pyplot as plt
img = cv2.imread('文件路径')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.rcParams['font.sans-serif'] = ['FangSong']
plt.subplot(2,2,1), plt.title("图1")
plt.imshow(img)
plt.subplot(2,2,2), plt.title("图2")
plt.imshow(img)
plt.subplot(2,2,3), plt.title("图3"),
plt.imshow(img)
plt.subplot(2,2,4), plt.title("图4"),
plt.imshow(img)
plt.show()
(3)拼接图像并显示
import cv2
import numpy as np
img1 = cv2.imread("1.jpg",cv2.IMREAD_UNCHANGED)
img2 = cv2.imread("2.jpg",cv2.IMREAD_UNCHANGED)
img2 = cv2.resize(img2,(img1.shape[1],img1.shape[0]))
res = np.hstack((img1,img2,img2))
cv2.imshow('res',res)
cv2.waitKey(0)
cv2.destroyAllWindows()
4、获取图像属性
heigh = img.shape[0]
width = img.shape[1]
h,w,d = img.shape
img_size = img.size
img.dtype
5、图像缩放(宽,高)
img2 = cv2.resize(img1, (200, 100))
img2 = cv2.resize(img1, (round(cols * 0.5), round(rows * 1.2)))
img2 = cv2.resize(img1, None, fx=1.2, fy=0)
6、在原图像中获取某一区域
img_x_y_1 = img[ : , x1(开始横坐标):x2(结束横坐标)]
img_x_y_2 = img[y1(开始纵坐标):y2(结束纵坐标), : ]
img_x_y = img[y1(开始纵坐标):y2(结束纵坐标),x1(开始横坐标):x2(结束横坐标)]
例如:
import cv2
path = 'C:\\Users\\lenovo\\Desktop\\demo.jpg'
img = cv2.imread(path)
img_1 = img[100:600,200:500]
cv2.imshow('1',img_1)
cv2.waitKey(0)
cv2.destroyAllWindows()
7、彩色图像通道分解
b = img[:,:,0]
g = img[:,:,1]
r = img[:,:,2]
b,g,r = cv2.split(img)
rgb = cv2.merge([r,g,b])
b = cv2.split(a)[0]
g = np.zeros((rows,cols),dtype=a.dtype)
r = np.zeros((rows,cols),dtype=a.dtype)
m = cv2.merge([b,g,r])
8、图像加法
result1 = img1 + img2
result2 = cv2.add(img1, img2)
result = cv2.addWeighted(img1,0.5,img2,0.5, 0)
9、图像反转
img2 = cv2.flip(img1, 0)
img2 = cv2.flip(img1, 1)
img2 = cv2.flip(img1, -1)
10、图像金字塔
img1 = cv2.pyrDown(img)
img3 = cv2.pyrUp(img2)
img1 = cv2.pyrDown(img)
img2 = cv2.pyrUp(img1)
img3 = img-img2
11、直方图
plt.hist(img.ravel(),256)
hist = cv2.calcHist(images= [img],channels=[0],mask=None,histSize=[256],ranges=[0,255])
pad = np.zeros(img.shape,np.uint8)
pad[200:400,200:400]=255
hist_MASK = cv2.calcHist(images= [img],channels=[0],mask=pad,histSize=[256],ranges=[0,255])
masked_img = cv2.bitwise_and(img,mask)
img1 = cv2.equalizeHist(img)
img_rgb = cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.subplot('2,2,1'),plt.imshow(img,cmap=plt.cm.gray),plt.axis('off'),plt.title('original')
plt.subplot('2,2,2'), plt.imshow(img1, cmap = plt.cm.gray), plt.axis('off')
plt.subplot('2,2,3'), plt.hist(img.ravel(),256)
plt.subplot('2,2,4'), plt.hist(img1.ravel(), 256)
12、图像类型转换
img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
img2 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)
img2 = cv2.cvtColor(img1, cv2.COLOR_GRAY2BGR)
13、图像阈值转换 、二值化
r,b = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)
r,b = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY_INV)
r,b = cv2.threshold(img,127,255,cv2.THRESH_TOZERO)
r,b = cv2.threshold(img,127,255,cv2.THRESH_TOZERO_INV)
r,b = cv2.threshold(img,127,255,cv2.THRESH_TRUNC)
14、图像平滑处理
img2 = cv2.blur(img1, (5, 5))
img1 = cv2.boxFilter(img, -1, (2, 2), normalize=1)
img1 = cv2.GaussianBlur(img, (3, 3), 0)
img1 = cv2.medianBlur(img,3)
15、图像形态学操作
(1)图像腐蚀,k为全为1的卷积核
k = np.ones((5,5),np.uint8)
img1 = cv2.dilate(img, k, iterations=2)
(2)图像膨胀
k = np.ones((5,5),np.uint8)
img1 = cv2.dilate(img, k, iterations=2)
(3)图像开运算 (先腐蚀后膨胀),去掉图形外侧噪点
k = np.ones((5,5),np.uint8)
img1 = cv2.morphologyEx(img, cv2.MORPH_OPEN, k, iterations=2)
(4)图像闭运算(先膨胀后腐蚀) ,去掉图形内侧噪点
k = np.ones((5,5),np.uint8)
img1 = cv2.morphologyEx(img, cv2.MORPH_CLOSE, k, iterations=2)
k=np.ones((5,5),np.uint8)
img1 = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, k)
k = np.ones((10,10),np.uint8)
img1 = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, k)
16、图像梯度,边缘检测
import cv2
import matplotlib.pyplot as plt
import numpy as np
img = cv2.imread('C:\\Users\\lenovo\\Desktop\\demo.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
img = cv2.GaussianBlur(img, (5, 5), 1)
img_median = cv2.medianBlur(img, 3)
img_gray = cv2.cvtColor(img_median, cv2.COLOR_BGR2GRAY)
kernelx = np.array([[-1, 0], [0, 1]], dtype=int)
kernely = np.array([[0, -1], [1, 0]], dtype=int)
x = cv2.filter2D(img_gray, cv2.CV_16S, kernelx)
y = cv2.filter2D(img_gray, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
plt.rcParams['font.sans-serif'] = ['FangSong']
plt.subplot(2,2,1), plt.title("Roberts算子"), plt.axis('off')
plt.imshow(Roberts,cmap='gray')
kernelx = np.array([[1,1,1],[0,0,0],[-1,-1,-1]],dtype=int)
kernely = np.array([[-1,0,1],[-1,0,1],[-1,0,1]],dtype=int)
x = cv2.filter2D(img_gray, cv2.CV_16S, kernelx)
y = cv2.filter2D(img_gray, cv2.CV_16S, kernely)
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
Prewitt = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
plt.subplot(2,2,2), plt.title("Prewitt算子"), plt.axis('off')
plt.imshow(Prewitt,cmap='gray')
sobelx = cv2.Sobel(img_gray, cv2.CV_8U, 1, 0, ksize=3)
sobely = cv2.Sobel(img_gray, cv2.CV_8U, 0, 1, ksize=3)
sobel = cv2.addWeighted(sobelx,1,sobely,1,0)
plt.subplot(2,2,3), plt.title("sobel算子"), plt.axis('off')
plt.imshow(sobel,cmap='gray')
binary = cv2.Canny(img_gray, 100, 200)
plt.subplot(2,2,4), plt.title("Canny算子"), plt.axis('off')
plt.imshow(binary,cmap='gray')
plt.show()
17、图像轮廓标注
gray_img = cv2.cvtColor(img_1,cv2.COLOR_BGR2GRAY)
dep,img_bin = cv2.threshold(gray_img,128,255,cv2.THRESH_BINARY)
image_contours,hierarchy = cv2.findContours(img_bin,mode=cv2.RETR_TREE,method = cv2.CHAIN_APPROX_SIMPLE)
to_write = img_1.copy()
ret = cv2.drawContours(to_write,image_contours,-1,(0,0,255),2)
plt.subplot(2,1,1),plt.imshow(ret,'gray')
plt.show()
18、读取视频文件
vc = cv2.VideoCapture("test. mp4")
if vc.isOpened():
oepn, frame = vc.reado()
else:
open = False
while open:
ret, frame = vc.read ()
if frame is None:
break
if ret == True:
gray = cv2. cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow("result", gray)
if cv2.waitKey(10) & OxFF == 27:
break
vc.release()
cv2.destroyAllWindows()
Original: https://blog.csdn.net/weixin_46085748/article/details/124655192
Author: z丶丶
Title: Python-OpenCV的基本使用
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/637871/
转载文章受原作者版权保护。转载请注明原作者出处!