OpenCV:day01-图像基本操作


文章目录

  • OpenCV:day01-图像基本操作
  • 一、读取图片、视频、摄像头
  • 二、写入图片
  • 三、操作像素
  • 四、创建图像
  • 五、图像剪切
  • 六、图像镜像
  • 七、图像缩放
  • 八、拆分与重组颜色通道
  • 九、BGR与LAB
  • 十、边界填充
  • 十一、数值计算
  • 十二、图像融合



代码仓库地址:

https://gitee.com/andox_yj/open-cv

一、读取图片、视频、摄像头

  1. 注意:
    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运算后在进行比较。
  2. 代码示例
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

二、写入图片

  1. 代码示例
import cv2

# 读取图片
img = cv2.imread("data/image.jpg")
# 写入一张图片
cv2.imwrite("data/lena_copy.jpg", img)

三、操作像素

  1. 代码示例
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)

四、创建图像

  1. 代码示例
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)

五、图像剪切

  1. 代码示例
    注意: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)

六、图像镜像

  1. 代码示例
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)

七、图像缩放

  1. 代码示例
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()

八、拆分与重组颜色通道

  1. 代码示例
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

  1. 代码示例
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

十、边界填充

  1. 代码示例
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()

十一、数值计算

  1. 代码示例
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()

十二、图像融合

  1. 代码示例
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()