cv2.imread(filename[, flags])
读取图像,返回该图像的像素值
参数 | 描述 |
---|---|
filename | 图片文件名(路径中不要有中文) |
flags | (可选参数值) 大于0时返回3通道彩色图像 等于0时返回灰度图像 |
返回值类型:numpy.ndarray
cv2.imshow(winname,mat)
生成一个窗口,显示图像
参数 | 描述 |
---|---|
winname | 生成窗口的名称 |
mat | 待显示的图像 |
cv2.imwrite(filename, image[, params])
将处理后的图像保存为文件
参数 | 描述 |
---|---|
filename | 要保存的图像文件名 |
image | 要保存的图像(数组) |
cv2.flip(src, flipCode[, dst])
参数 | 描述 |
---|---|
src | 原始图像 |
flipCode | 翻转类型 flipCode=0:沿着x轴翻转 flipCode>0:沿着y轴翻转 flipCode<0:同时沿着xy轴翻转 |
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
参数 | 描述 |
---|---|
src | 原始图像 |
dsize | 目标图像大小 |
dst | 目标图像 |
fx | 水平方向缩放比例 |
fy | 竖直方向缩放比例 |
cv.line(img, pt1, pt2, color, thickness=1, lineType=8, shift=0)
参数 | 描述 |
---|---|
img | 图像或画布 |
pt1 | 线段起点(x,y) |
pt2 | 线段终点(x,y) |
color | 线段颜色 |
thickness | 线段宽度 |
import numpy as np
import cv2
canvas=np.zeros((500,300,3),np.int8)
canvas=cv2.line(canvas,(50,50),(250,50),(255,0,0),5)
canvas=cv2.line(canvas,(150,50),(0,200),(0,255,0),10)
canvas=cv2.line(canvas,(0,200),(300,200),(0,0,255),15)
canvas=cv2.line(canvas,(300,200),(150,50),(255,0,0),20)
canvas=cv2.line(canvas,(150,200),(150,500),(255,255,0),25)
cv2.imwrite('../imgs/draw_lines.jpg',canvas)
cv.rectangle(img, pt1, pt2, color, thickness=1, lineType=8, shift=0)
参数 | 描述 |
---|---|
img | 图像或画布 |
pt1 | 矩形左上角坐标(x,y) |
pt2 | 矩形右下角坐标(x,y) |
color | 线段颜色 |
thickness | 线段宽度,当该值小于0时将绘制一个实心矩形 |
import cv2
img=cv2.imread('../imgs/R-C_resize.jpg')
# 生成一个空心矩形
canvas=cv2.rectangle(img,(50,23),(347,286),(0,0,255),1)
# 生成两个实心矩形
canvas=cv2.rectangle(canvas,(10,23),(40,53),(0,0,255),-1)
canvas=cv2.rectangle(canvas,(10,256),(40,286),(0,0,255),-1)
cv2.imwrite('rect_img.jpg',canvas)
cv2.circle(img, center, radius, color[, thickness[, lineType[, shift]]])
参数 | 描述 |
---|---|
img | 图像或画布 |
center | 圆心坐标 |
radius | 圆半径 |
color | 线段颜色 |
thickness | 线段宽度,当该值小于0时将绘制一个实心圆 |
import cv2
import numpy as np
#生成画布
canvas=np.zeros((500,600,3),np.uint8)
# 定义参数
radius=180
color=(255,255,255)
for i in range(4):
canvas=cv2.circle(canvas,(300,250),radius,color,10)
radius-=30
canvas=cv2.circle(canvas,(300,250),radius,color,-1)
cv2.imwrite('circle.jpg',canvas)
cv.polyLine(img, polys, isClosed, color, thickness=1, lineType=8, shift=0)
参数 | 描述 |
---|---|
img | 图像或画布 |
polys | 由多边形各个顶点组成的列表 |
isClosed | 多边形是否闭合 |
color | 线段颜色 |
thickness | 线段宽度 |
import cv2
import numpy as np
polys = np.array([[(200, 200),
(400, 200),
(500, 200 + 100 * np.sqrt(3)),
(400, 200 + 200 * np.sqrt(3)),
(200, 200 + 200 * np.sqrt(3)),
(100, 200 + 100 * np.sqrt(3))]],dtype=np.int32)
canvas = np.zeros((999, 999, 3), np.uint8)
canvas = cv2.polylines(canvas, [polys], isClosed=True, color=(255, 255, 255),thickness=10)
canvas = cv2.polylines(canvas, [polys+300], isClosed=True, color=(255, 255, 255),thickness=10)
cv2.imwrite('../imgs/polys.jpg', canvas)
运行过程中的一个报错:p.checkVector(2, CV_32S) >= 0 in function ‘cv::polylines’
原因:上面的代码中顶点坐标出现了 3 \sqrt3 3,使用dtype参数将其转化为整数即可
cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, linetype[, bottomLeftOrigin]]])
参数 | 描述 |
---|---|
img | 图像或画布 |
text | 要绘制的文字内容 |
org | 文字字符串左下角坐标 |
fontFace | 字体样式 |
fontSacle | 字体大小 |
color | 字体颜色 |
import cv2
import numpy as np
# 生成画布
canvas=np.zeros((240,240,3),np.uint8)
cv2.putText(canvas,'hello',(20,60),cv2.FONT_HERSHEY_SCRIPT_SIMPLEX,2,(0,255,0),5)
cv2.putText(canvas,'hello',(20,120),cv2.FONT_ITALIC+cv2.FONT_HERSHEY_TRIPLEX,2,(0,255,0),5)
cv2.putText(canvas,'hello',(20,180),cv2.FONT_HERSHEY_SIMPLEX,2,(0,255,0),5)
cv2.imwrite('../imgs/font_img.jpg',canvas)
cv2.threshold(src, thresh, maxval, type[, dst])
参数 | 描述 |
---|---|
src | 被处理的图像 |
thresh | 阈值 |
maxval | 最大阈值 |
type | 阈值处理类型 |
dst | 经阈值处理后的图像 |
阈值处理类型 | 描述 | 范围 | |
---|---|---|---|
cv2.THRESH_BINARY | 二值化 | 像素值>thresh时,取maxval,否则取0 | 0或maxval |
cv2.THRESH_BINARY_INV | 反二值化 | 像素值>thresh时,取0,否则取maxval | 0或maxval |
cv2.THRESH_TRUNC | 截断阈值处理 | 像素值>thresh时,取阈值,否则像素值不变 | 原始像素值或阈值 |
cv2.THRESH_TOZERO | 低于阈值零处理 | 像素值>thresh时,像素值不变,否则取0 | 0或原始像素值 |
cv2.THRESH_TOZERO_INV | 高于阈值零处理 | 像素值>thresh时,像素值取0,否则像素值不变 | 0或原始像素值 |
import cv2
import matplotlib.pyplot as plt
import matplotlib
plt.subplots_adjust(hspace=0.5)
matplotlib.rcParams['font.family']='SimHei'
img=cv2.imread('../imgs/R-C_resize.jpg')
plt.subplot(321)
plt.title('原始图像')
plt.imshow(img)
plt.subplot(322)
plt.title('二值化')
plt.imshow(cv2.threshold(img,150,255,cv2.THRESH_BINARY)[1])
plt.subplot(323)
plt.title('反二值化')
plt.imshow(cv2.threshold(img,150,255,cv2.THRESH_BINARY_INV)[1])
plt.subplot(324)
plt.title('低于阈值零处理')# 低于阈值的像素值归零
plt.imshow(cv2.threshold(img,150,255,cv2.THRESH_TOZERO)[1])
plt.subplot(325)
plt.title('高于阈值零处理')
plt.imshow(cv2.threshold(img,150,255,cv2.THRESH_TOZERO_INV)[1])
plt.subplot(326)
plt.title('截断处理')
plt.imshow(cv2.threshold(img,150,255,cv2.THRESH_TRUNC)[1])
plt.show()
注意:在这里笔者使用的是plt.imshow()函数来展示阈值处理后的图像,当你是用cv2.imshow()函数来展示这些图像时,你会发现两者相别很大,后者显示的图像内容如下,这是因为open默认使用BGR通道,但是matplotlibt默认使用RGB通道,所以会造成这种情况,解决这一问题很简单,在
plt.imshow()
时加入参数cmap='gray'
即可
阈值根据指定方法进行计算
cv2.adaptiveThreshold(src, maxValue, adaptiveMethod, thresholdType, blockSize, C[, dst])
参数 | 描述 |
---|---|
src | 待处理的图像 |
maxValue | 阈值处理最值 |
adaptiveMethod | 自适应阈值计算方法 |
thresholdType | 阈值处理类型 |
dst | 经过处理后的图像 |
阈值处理类型
阈值计算方法
import cv2
import matplotlib.pyplot as plt
plt.subplots_adjust(hspace=0.5)
import matplotlib
matplotlib.rcParams['font.family']='SimHei'
img=cv2.imread('../imgs/R-C_resize.jpg')
gray_img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)# 将图像转换为灰度
MEAN_img=cv2.adaptiveThreshold(gray_img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,5,2)
GAUSSION_img=cv2.adaptiveThreshold(gray_img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,5,2)
plt.subplot(221)
plt.title('原图像')
plt.imshow(img)
plt.subplot(222)
plt.title('MEAN')
plt.imshow(MEAN_img,cmap='gray')
plt.subplot(223)
plt.title('GAUSSION')
plt.imshow(GAUSSION_img,cmap='gray')
plt.show()