python opencv的使用小结

opencv官网

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_CUBIC4*4区域双三次插值
INTER_LANCZOS48*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  # 融合后放在原图上

cv2.bitwise_not以及掩膜的操作

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值