OpenCV:day01-图像基本操作
文章目录
- OpenCV:day01-图像基本操作
- 一、读取图片、视频、摄像头
- 二、写入图片
- 三、操作像素
- 四、创建图像
- 五、图像剪切
- 六、图像镜像
- 七、图像缩放
- 八、拆分与重组颜色通道
- 九、BGR与LAB
- 十、边界填充
- 十一、数值计算
- 十二、图像融合
代码仓库地址:
https://gitee.com/andox_yj/open-cv
一、读取图片、视频、摄像头
- 注意:
cv2.waitKey() = cv2.waitKey(0) = cv2.waitKey(-1),都是等待用户按键,返回按键的ascii。 cv2.waitKey(10) == ord('q'): 返回q的ascii码 cv2.waitKey(10) & 0xFF == 27: 0xFF :一个十六进制数,与cv2.waitKey(10)的返回值进行按位与运算 由于waitKey有时候返回的ascii可能不准,所有就将waitKey返回的值与0xFF运算后在进行比较。
- 代码示例
import cv2
# ################# 1、读取图片 ####################
img = cv2.imread("./image.jpg")
# 显示图像
cv2.imshow("src", img)
# 让程序等待多少秒后结束,单位:毫秒
# cv.waitKey(1000)
# 让程序扥带用户点击案件后结束
# cv.waitKey(0)
# 接收用户按键返回的ASCII码
key = cv2.waitKey(0)
print(key)
# ################# 2、读取视频 ####################
capture = cv2.VideoCapture("./data/car.mp4")
while (True):
# 获取一帧
ret, frame = capture.read()
cv2.imshow('frame', cv2.flip(frame, 1))
# 如果输入q,则退出
# if cv2.waitKey(1000) == ord('q'):
if cv2.waitKey(1) & 0xFF == 27:
break
# ################# 3、读取摄像头 ####################
capture = cv2.VideoCapture(0)
while (True):
# 获取一帧
ret, frame = capture.read()
# 将这帧转换为灰度图
# gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
cv2.imshow('frame', cv2.flip(frame, 1))
# 如果输入q,则退出
# if cv2.waitKey(1000) == ord('q'):
if cv2.waitKey(10) & 0xFF == 27:
break
二、写入图片
- 代码示例
import cv2
# 读取图片
img = cv2.imread("data/image.jpg")
# 写入一张图片
cv2.imwrite("data/lena_copy.jpg", img)
三、操作像素
- 代码示例
import cv2 as cv
# 读取图片
img = cv.imread("data/image.jpg")
# 获取图像的宽高
width, height, channels = img.shape
# 输出每个像素值
# for row in range(width):
# for col in range(height):
# color = img[row, col]
# print(color)
# 将图片中间一行像素值改为红色
for col in range(height):
# 将480行的每个像素值都修改为红色
# opencv的颜色值是BGR
img[480, col] = (0, 0, 255)
# 显示图像
cv.imshow("img", img)
cv.waitKey(0)
四、创建图像
- 代码示例
import cv2 as cv
import numpy as np
# 创建图像
img = np.zeros((200, 300, 3), np.uint8)
for col in range(300):
img[100, col] = (0, 0, 255)
cv.imshow("src", img)
cv.waitKey(0)
五、图像剪切
- 代码示例
注意:python的切片属于浅拷贝,当修改剪切出来的图片是,原始图片数据也会被改变
import cv2 as cv
img = cv.imread("data/image.jpg")
# 利用python的切片功能进行截取img[起始行号:结束行号,起始列号:结束列号]
dst = img[180:850, 180:810]
# 修改截取的图像
for col in range(630):
# 将截取后图像的第400行的每个像素点修改为红色
dst[400, col] = (0, 0, 255)
# 显示截取的图像
cv.imshow("dst", dst)
# 显示原始图像
cv.imshow("src", img)
cv.waitKey(0)
六、图像镜像
- 代码示例
import cv2 as cv
import numpy as np
# 读取图片
img = cv.imread("data/python.jpg")
# 获取图片尺寸
height, width, channels = img.shape
# ################# x方向镜像图片 ####################
# 创建两倍原图大小的画布出来
dst = np.zeros((height * 2, width, 3), np.uint8)
for row in range(height):
for col in range(width):
# 绘制第一个图像
dst[row, col] = img[row, col]
# 绘制镜像图像,下标是种0开始,所以需要减1
dst[height * 2 - row - 1, col] = img[row, col]
# 图像镜像的动画显示
# cv.imshow("dst", dst)
# cv.waitKey(1)
cv.imshow("dst", dst)
cv.imshow("img", img)
cv.waitKey(0)
# ################# y方向镜像图像 ####################
# 创建两倍原图大小的画布出来
dst2 = np.zeros((height, width * 2, 3), np.uint8)
for row in range(height):
for col in range(width):
# 绘制第一个图像
dst2[row, col] = img[row, col]
# 绘制镜像图像,下标是种0开始,所以需要减1
# print(img[row, col])
dst2[row, width * 2 - col - 1] = img[row, col]
# 图像镜像的动画显示
# cv.imshow("dst", dst2)
# cv.waitKey(1)
print(dst2.shape)
cv.imshow("dst", dst2)
cv.imshow("img", img)
cv.waitKey(0)
七、图像缩放
- 代码示例
import cv2 as cv
# 读取图片
img = cv.imread("data/zfx.jpg")
# 获取图片尺寸
height, width, channels = img.shape
# 此处需要正方形的图片才能按照比例缩放大小
dst = cv.resize(img, (height * 2, width * 2))
cv.imshow("dst", dst)
cv.imshow("img", img)
cv.waitKey()
八、拆分与重组颜色通道
- 代码示例
import cv2
# ################# 拆分图片颜色通道 ####################
image = cv2.imread('data/image.jpg')
# 使用opencv的函数拆分
b, g, r = cv2.split(image)
# 使用切片拆分
b = image[:, :, 0]
g = image[:, :, 1]
r = image[:, :, 2]
cv2.imshow('b', b)
cv2.imshow('g', g)
cv2.imshow('r', r)
cv2.waitKey(0)
# ################# 重组图片颜色通道 ####################
image2 = cv2.merge((b, g, r))
cv2.imshow('dse', image2)
cv2.waitKey(0)
# ################# 只保留一个颜色通道,其他颜色置为0 ####################
image[:, :, 1] = 0
image[:, :, 2] = 0
cv2.imshow('image', image)
cv2.waitKey(0)
九、BGR与LAB
- 代码示例
import cv2
# ################# BGR颜色空间 ####################
img_1 = cv2.imread("./data/1.jpg") # 白色
img_2 = cv2.imread("./data/2.jpg") # 黑色
print(img_1[:, :, 0]) # 255 蓝色0-255
print(img_2[:, :, 0]) # 0 蓝色0-255
print(img_1[:, :, 1]) # 255 绿色0-255
print(img_2[:, :, 1]) # 0 绿色0-255
print(img_1[:, :, 2]) # 255 红色0-255
print(img_2[:, :, 2]) # 0 红色0-255
# ################# LAB颜色空间 ####################
img_1 = cv2.imread("./data/1.jpg") # 白色
img_2 = cv2.imread("./data/2.jpg") # 黑色
img_1 = cv2.cvtColor(img_1, cv2.COLOR_RGB2LAB)
img_2 = cv2.cvtColor(img_2, cv2.COLOR_RGB2LAB)
print(img_1[:, :, 0]) # 255 黑色0-白色255
print(img_2[:, :, 0]) # 0 黑色0-白色255
print(img_1[:, :, 1]) # 128 绿色0-红色255
print(img_2[:, :, 1]) # 128 绿色0-红色255
print(img_1[:, :, 2]) # 128 蓝色0-黄色255
print(img_2[:, :, 2]) # 128 蓝色0-黄色255
十、边界填充
- 代码示例
import cv2
import matplotlib.pyplot as plt
image = cv2.imread("data/image.jpg")
add_size = 200
# ################# 参1:图片数据,参2-5:上下左右的填充大小,参6:填充方式 ####################
# BORDER_REPLICATE:复制法,复制图像最外围的一个像素点进行填充
replicate = cv2.copyMakeBorder(image, add_size, add_size, add_size, add_size, borderType=cv2.BORDER_REPLICATE)
# BORDER_REFLECT:反射法,例如:左填充4321:1234:4321右填充
reflect = cv2.copyMakeBorder(image, add_size, add_size, add_size, add_size, borderType=cv2.BORDER_REFLECT)
# BORDER_REFLECT_101:反射法101,例如: 左填充432:1234:321右填充
reflect101 = cv2.copyMakeBorder(image, add_size, add_size, add_size, add_size, borderType=cv2.BORDER_REFLECT_101)
# BORDER_WRAP:外包装法,既平铺,左填充..34:1234:12..右填充
wrap = cv2.copyMakeBorder(image, add_size, add_size, add_size, add_size, borderType=cv2.BORDER_WRAP)
# BORDER_CONSTANT:常量法,value为填充值,可以为一直int,也可以为rgb三元色元祖
constant = cv2.copyMakeBorder(image, add_size, add_size, add_size, add_size, borderType=cv2.BORDER_CONSTANT,value=(255, 0, 0))
# 显示填充后的图像
plt.subplot(231), plt.imshow(image, "gray"), plt.title("ORIGINAL")
plt.subplot(232), plt.imshow(replicate, "gray"), plt.title("ORIGINAL")
plt.subplot(233), plt.imshow(reflect, "gray"), plt.title("ORIGINAL")
plt.subplot(234), plt.imshow(reflect101, "gray"), plt.title("ORIGINAL")
plt.subplot(235), plt.imshow(wrap, "gray"), plt.title("ORIGINAL")
plt.subplot(236), plt.imshow(constant, "gray"), plt.title("ORIGINAL")
plt.show()
十一、数值计算
- 代码示例
import cv2
image = cv2.imread("./data/red.jpg")
image1 = cv2.imread("./data/red.jpg")
cv2.imshow("original", image)
# ################# 像素与值相加 ####################
# 取前面五行,每行前四个像素,bgr取r通道数据
print(image[:5, :4, 2])
# 每个像素的brg值都+10
image2 = image + 10
print(image2[:5, :4, 2])
cv2.imshow("image2", image2)
cv2.waitKey()
# ################# 像素与像素相加1 ####################
# bgr分别相加,得到的值如果超过255(从0开始,一个256),就会减255。
image3 = image + image1
cv2.imshow("image3", image3)
cv2.waitKey()
# ################# 像素与像素相加2 ####################
# bgr分别相加,如果超过255,则是255。
image4 = cv2.add(image, image1)
cv2.imshow("image4", image4)
# 去前五行,每行的所有值的b通道
print(image4[:5, :, 0])
cv2.waitKey()
十二、图像融合
- 代码示例
import cv2
image = cv2.imread("./data/csdn.jpg")
image1 = cv2.imread("./data/python.jpg")
cv2.imshow("original", image)
# ################# 图像修改大小:指定宽高 ####################
image2 = cv2.resize(image, (1306, 430))
cv2.imshow("image2", image2)
# ################# 图像修改大小:指定倍数 ####################
image3 = cv2.resize(image, (0, 0), fx=2.5, fy=2.5)
cv2.imshow("image3", image3)
# ################# 图像融合 ####################
# 注意,得尺寸大小相同的图片才能使用图像融合
# 图片1,图片1权重,图片2,图片2权重,偏置项
# 权重总和为1就好,也可以超过1,
# 偏置项是在图像融合后给整体图像像素添加一个值,可为负值,最终结果不会低于0和超过255
image4 = cv2.addWeighted(image2, 0.8, image1, 0.2, -50)
cv2.imshow("image4", image4)
cv2.waitKey()