引用:https://blog.csdn.net/wfei101/article/details/82024877
1. 图片加载、显示和保存
import cv2
#读取图像 "01.jpg":图像位置 0:通道参数
imgGrey = cv2.imread("01.jpg",0)#显示图像 "img":图像名字 img:需要显示的图像
#往往跟waitKey搭配使用 2000:显示2000ms
cv2.imshow("img",img)
cv2.waitKey(2000)#图片保存 "Copy.jpg":图像保存路径 img:需要保存的图像
cv2.imwrite("Copy.jpg",img)
2. 图像显示窗口创建与销毁
#跟cv2.imshow搭配使用 窗口名
cv2.namedWindow(窗口名,属性) 创建一个窗口
#很多情况下面没用
cv2.destoryAllWindows(窗口名) 删除任何建立的窗口
3. 图片宽、高、通道数获取
#img.shape返回一个图像矩阵元组
sp1 = img.shape
4. 图像像素数目和图像数据类型获取
#图像分辨率 300*500即图像像素数量
imgSize = img.size
#一般是uint8归一化之前
ty = img.dtype
5. 生成指定大小的空图像
imgZero = np.zeros(img.shape,np.uint8)
imgFix = np.zeros((300,500,3),np.uint8)
6. 访问和操作图像像素
像素点颜色是由三个通道共同决定的。三原色红黄蓝:(255,0,0),(0,255,0),(0,0,255)
RGB分为3个通道,0-255表示通道颜色的亮度,3通道叠加才是我们看到的图像
#图像上一个像素点改为蓝色
numb = img[50,100]
img[50,100] = (0,0,255)
分开访问图像某一通道像素值
#把0通道的0-100*100-200面积的颜色亮度调到最高
img[0:100,100:200,0] = 255
#把0-50*1-100面积颜色改为蓝色
img[0:50,1:100] = (0,0,255)
7. 图像三通道分离和合并
元组提取成3个通道
b , g , r = cv2.split(img)
三通道合一
merged = cv2.merge([b,g,r])
8. 在图像上输出文字
‘’‘img:图像
Print some text to img:文字内容
(100,100)文字左下角坐标
cv2.FONT_HERSHEY_SIMPLEX:字体
0.54:文字大小
1:字体粗细
(0,0,255):颜色
’‘’
cv2.putText(img,"Print some text to img",(100,100),cv2.FONT_HERSHEY_SIMPLEX,0.54,1,(0,0,255))
9. 图像缩放
#img:输入图像
#img2.jpg:输出图像
#(2*cols, 2*rows) 输出图片尺寸
#0.5,0.5 沿着x,y轴缩放系数
#interpolation 插入方式
img_ex = cv2.resize(img, "img2.jpg",(2*cols, 2*rows),0.5,0.5, interpolation=cv2.INTER_CUBIC)
10:灰度转换
path = 'static/111.jpg' img = cv2.imread(path,-1) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
11:图片二值化
# 利用Sobel边缘检测生成二值图 sobel = cv2.Sobel(gray, cv2.CV_8U, 1, 0, ksize=3)
12:二值化
# 二值化 ret, binary = cv2.threshold(sobel, 40, 255, cv2.THRESH_OTSU + cv2.THRESH_BINARY)
13:返回指定形状和尺寸的结构元素
矩形:MORPH_RECT;
交叉形:MORPH_CROSS;
椭圆形:MORPH_ELLIPSE;
kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(11,11))
14:膨胀(突出轮廓)腐蚀(消除细节)
dilation = cv2.dilate(binary, element2, iterations=1)erosion = cv2.erode(dilation, element1, iterations=1)
15:检测物体轮廓
#dilation,二值图像
contours, hierarchy = cv2.findContours(dilation ,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
16:最小外接矩形
rect = cv2.minAreaRect(cnt) box = cv2.boxPoints(rect) #box:外接矩形4点坐标 box = np.int0(box)
17:图像旋转
#center:旋转中心位置坐标 #angle:旋转角度 #dsize:图片缩放 rotate_matrix = cv2.getRotationMatrix2D(center=(center_x, center_y), angle=angle, scale=1) rotated_image = cv2.warpAffine(src=img, M=rotate_matrix, dsize=(img_w, img_h))
18画标签框
方框
#angel_image:图片
#(int(points[0][0]), int(points[0][1])), (int(points[1][0]), int(points[1][1])),左上角右下角坐标,原点为左上角
#color:框颜色
#thickness框宽度
cv2.rectangle(angel_image, (int(points[0][0]), int(points[0][1])), (int(points[1][0]), int(points[1][1])), color=(0, 0, 255), thickness=1) cv2.imshow('aaa', angel_image)多边形框:
#需要描点的坐标
points=[[12,24],[34,57],[323,434],[321,7657]]
pts = np.array(points, np.int32) # 数据类型必须为 int32 pts = pts.reshape((-1, 1, 2)) # 绘制未填充的多边形 cv2.polylines(angel_image, [pts], isClosed=True, color=(0, 0, 255), thickness=1)