1基本的图像操作
首先import cv2
img_path=“F:/img.ipg”
2最基础的操作
1.图像的读取
img=cv2.imread(img_path)
img=cv2.imread(img_path,flag)
flags >0返回一个3通道的彩色图像。
flags =0返回灰度图像。
flags <0返回包含Alpha通道的加载的图像。
2.图像的显示
cv2.imshow(‘lena’, img)
cv2.waitKey(0)
#先定义窗口,后显示图片
cv2.namedWindow(‘lena2’, cv2.WINDOW_NORMAL)
cv2.imshow(‘lena2’, img)
cv2.waitKey(0)
3.保存图像
cv2.imwrite(save_path,img)#save_path保存路径以.jpg结尾or其他
具体的代码:
# 图像读入操作计时
start = cv2.getTickCount()
# 读入一张图片
img = cv2.imread('lena.jpg')
# 停止计时
end = cv2.getTickCount()
# 单位:s
print((end - start) / cv2.getTickFrequency())
#显示图像
cv2.imshow('lena', img)
cv2.waitKey(0)
# 先定义窗口,后显示图片
cv2.namedWindow('lena2', cv2.WINDOW_NORMAL)
cv2.imshow('lena2', img)
cv2.waitKey(0)
3关于像素点的操作
重要函数
b, g, r = cv2.split(img),分割通道
img = cv2.merge((b, g, r))融合通道
import cv2
img = cv2.imread('lena.jpg')
# 1.获取像素的值
px = img[100, 90]
print(px) # [103 98 197]
# 只获取蓝色blue通道的值
px_blue = img[100, 90, 0]
print(px_blue) # 103# 2.修改像素的值
img[100, 90] = [255, 255, 255]
print(img[100, 90]) # [255 255 255]
# 3.图片形状
print(img.shape) # (263, 247, 3)
# 形状中包括行数、列数和通道数
height, width, channels = img.shape
# img是灰度图的话:height, width = img.shape
# 总像素数
print(img.size) # 263*247*3=194883
# 数据类型
print(img.dtype) # uint8
# 4.ROI截取
face = img[100:200, 115:188]
cv2.namedWindow('face', cv2.WINDOW_NORMAL)
cv2.imshow('face', face)
cv2.waitKey(0)
# 5.通道分割与合并
b, g, r = cv2.split(img)
img = cv2.merge((b, g, r))
# 更推荐的获取某一通道方式
b = img[:, :, 0]
cv2.imshow('b', b)
cv2.waitKey(0)
4颜色空间的转换
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.COLOR_BGR2RGB、 cv2.COLOR_BGR2GRAY、 cv2.COLOR_BGR2HSV、
cv2.COLOR_BGR2YCrCb、v2.COLOR_BGR2HLS、 cv2.COLOR_BGR2XYZ
cv2.COLOR_BGR2LAB、 cv2.COLOR_BGR2YUV
一般搭配plt.subplot(3,3,9); plt.imshow(img_YUV);plt.axis(‘off’);plt.title(‘YUV’)
plt.show()可以观察转化之后的图像。
其中查看cv2的颜色模式可以使用代码:
flags = [i for i in dir(cv2) if i.startswith(‘COLOR_’)]
print(flags)
5阈值分割
主要的函数ret,th=cv2.threshold(img,thresh,maxval,type)其中thresh未阈值,maxval为最大值,type为采用的分割类型。常用值为0(cv2.THRESH_BINARY)
返回值ret为当前的阈值,th为分割后的图像
图像增强操作
1.图像尺寸变换
cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst
eg:img_new=cv2.resize(img,(width_new,high_new))
或者# 按照比例缩放,如x,y轴均放大一倍
res2 = cv2.resize(img, None, fx=2, fy=2, interpolation=cv2.INTER_LINEAR)
interpolation选项 | 所用的插值方法 |
---|---|
INTER_NEAREST | 最近邻插值 |
INTER_AREA | 像素区域关系进行重采样 |
INTER_LINER | 双线性插值 |
INTER_CUBIC | 4*4区域双三次插值 |
INTER_LANCZOS4 | 8*8像素区域的lanczos插值 |
2图像旋转
#求得旋转中心
h, w = img.shape[:2]
center = (w // 2, h // 2)
# 旋转中心坐标,逆时针旋转:45°,缩放因子:0.5
M_1 = cv2.getRotationMatrix2D(center, 45, 0.5)
rotated_1 = cv2.warpAffine(img, M_1, (w, h))
#翻转
dst = cv2.flip(img, 1)
# np.hstack: 横向并排,对比显示
cv2.imshow('flip', np.hstack((img, dst))) # np.hstack: 横向并排,对比显示
3、图像裁剪
cropped = img[0:128, 0:512] # 裁剪坐标为[y0:y1, x0:x1]
直接裁剪
4、图像中心化
def center_img(img, size=None, fill_value=255):
"""
center img in a square background
"""
h, w = img.shape[:2]
if size is None:
size = max(h, w)
shape = (size, size) + img.shape[2:]
background = np.full(shape, fill_value, np.uint8)
center_x = (size - w) // 2
center_y = (size - h) // 2
background[center_y:center_y + h, center_x:center_x + w] = img
return background
对现有的一张图像进行一个绘图操作
#所有的最后一个参数表示线的粗细,如果设置为-1,则会填充整个图形
#img为读取的图像
#画一条线比如宽为5,起点(0,0),终点(500,500)颜色为蓝色
cv2.line(img,(0,0),(500,500),(255,0,0),5)
#画一个绿色的边框,参数二左上角坐标,参数3右下角参数,最后一个参数线的粗细
cv2.rectangle(img,(384,0),(500,50),(0,255,0),5)
# 3.画一个填充红色的圆,参数2:圆心坐标,参数3:半径
cv2.circle(img,(447,63),63,(0,0,255),5)
# 4.在图中心画一个填充的半圆,其中0,45,180分别表示顺时针以0位0°,0°到45°度没有图案,45到180之间有图案
cv2.ellipse(img,(500,500),(weidth,high),0,45,180,(255,0,0),5)
# 5.画一个闭合的四边形
# 定义四个顶点坐标
pts=np.array([10,5],[50,10],[70,20],[20,30],np.int32)
pts=pts.reshape((-1,1,2))
cv2.ploylines(img,[pts],True,(0,255,255))
# 使用cv2.polylines()画多条直线
line1 = np.array([[100, 20], [300, 20]], np.int32).reshape((-1, 1, 2))
line2 = np.array([[100, 60], [300, 60]], np.int32).reshape((-1, 1, 2))
line3 = np.array([[100, 100], [300, 100]], np.int32).reshape((-1, 1, 2))
cv2.polylines(img, [line1, line2, line3], True, (0, 255, 255))
# 6.添加文字
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'ex2tron', (10, 500), font,
4, (255, 255, 255), 2, lineType=cv2.LINE_AA)
备注:numpy,reshape函数使用的时候-1代表那一维的个数不确定
图像融合
1、图像的尺寸一致
res=cv2.addweighted(img1,.9,img2,.1,0)
img1 = cv2.imread(‘lena_small.jpg’)
img2 = cv2.imread(‘opencv-logo-white.png’)
cv2.addweighted更加详细的介绍
2、图像尺寸不一致
img1 = cv2.imread('lena.jpg')
img2 = cv2.imread('opencv-logo-white.png')
# 把logo放在左上角,所以我们只关心这一块区域
rows, cols = img2.shape[:2]
roi = img1[:rows, :cols]
# 创建掩膜
img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)
ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY)
mask_inv = cv2.bitwise_not(mask)
img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)
dst = cv2.add(img1_bg, img2) # 进行融合
img1[:rows, :cols] = dst # 融合后放在原图上