Skip to main content

图片处理

所有 CV2.flag

import cv2
def list_flag(flag_piefix:str='TM_'):
flags = [i for i in dir(cv2) if i.startswith(flag_piefix)]
for each in flags:
print('cv2.{}: '.format(each), end="")
eval('print(cv2.{})'.format(each))

list_flag()

图片预览

cv2.imshow(windows_name:str, image:cv2.Img)

窗口销毁

当我们使用 imshow 函数展示图像时,最后需要在程序中对图像展示窗口进行销毁,否则程序将无法正常终止,常用的销毁窗口的函数有下面两个

# 销毁单个特定窗口
cv2.destroyWindow(windows_name)

# 销毁全部窗口,无参数
cv2.destroyAllWindows()

那我们合适销毁窗口,肯定不能图片窗口一出现我们就将窗口销毁,这样便没法观看窗口,试想有两种方式:

# 唯一参数 time_of_millisecond s是整数,
# 可正可负也可是零,含义和操作也不同,分别对应上面说的两种情况
# 大于0 单位是毫秒,含义表示等待 time_of_milliseconds毫秒后图像将自动销毁
# 小于等于0 此时图像窗口将等待一个键盘敲击,接收到指定的键盘敲击便会进行窗口销毁
cv2.waitKey(time_of_milliseconds)

def show_cv2_img(img, title:str='test', delay:int=0) -> NoReturn:
cv2.imshow(title, img)
cv2.waitKey(delay)

(1) 让窗口停留一段时间然后自动销毁;

# 表示等待10秒,将销毁窗口名称为'origin image'的图像窗口
def show_cv2_img(img):
cv2.imshow('tset', img)
cv2.waitKey(1000)

(2) 接收指定的命令,如接收指定的键盘敲击然后结束我们想要结束的窗口

def show_cv2_img(img):
cv2.imshow('tset', img)
cv2.waitKey(0)

打开图片

# 语法
cv2.imread(filename:str, channel:CV2_channel)

gray_img = cv2.imread('img/cartoon.jpg', 0) #加载灰度图像
rgb_img = cv2.imread('img/cartoon.jpg', 1) #加载RGB彩色图像

常用的 CV2_channel:

  • cv2.IMREAD_COLOR | 1:加载彩色图像。任何图像的透明度都将被忽略。它是默认标志
  • cv2.IMREAD_GRAYSCALE | 0:以灰度模式读入图像
  • cv2.IMREAD_UNCHANGED | -1:顾名思义,读入完整图片,包括 alpha 通道

保存图片

cv2.imwrite(image_filename, image)

# 保存不同的格式只需要设置不同的后缀名
cv2.imwrite('rgb_img.jpg', rgb_img) #将图像保存成jpg文件
cv2.imwrite('gray_img.png', gray_img) #将图像保存成png文件
def save_img(img, filename):
cv2.imwrite(filename, img)

获取图片信息

img = cv2.imread(picture)

img_info = {
"width":img.shape[1],
"height":img.shape[0]
}

格式转换

BMP

  • 通过后缀名
img = cv2.imread(img_path)

# 根据后缀名,通过save api导出文件
output_name
output_ext = '.jpg'
img.save(f'{output_name}{.output_ext}', img)
  • 转换成 byte
img = cv2.imread(img_path)
output_ext = '.bmp'
img_to_bytes_res = cv2.imencode(output_ext, img)

if img_to_bytes_res[0]:
img_byte = img_to_bytes_res[1].tobytes()
bmp_data = img_byte

if output_ext == '.bmp':
# 去掉信息头
bmp_data = img_byte[14:]

去除背景

像素操作

# 对图像取反
reverse_img = 255 - gray_img

# 对图像像素线性变换
for i in range(gray_img.shape[0]):
for j in range(gray_img.shape[1]):
random_img[i, j] = gray_img[i, j]*1.2

透视变换

通道提取

注意:cv2 的默认通道顺序是 “B”, “G”, “R”,

方法 1 - 切片

# 获取B通道,既将其他通道填充0即可
b = img.copy()
b[:,:,1] = 0 #g 通道填充0
b[:,:,2] = 0 #r 通道填充0
cv2.imshow('b', b)

方法 2 - cv2.split(img)

# 直接获取所有通道
b,g,r = cv2.plit(img)

cv2.imgshow('b',b)
# 重新何必
new_img = cv2.merge((b,g,r))

二值化

灰度化

区域裁图(ROI)

from typing import *
import cv2

Img = NewType('cv2.readimg', list)
Region = NewType('(startX:endX, startY,endY)', Tuple[int])

def img_cut(cv2img:Img, region:Region) -> Img:
# img[startX:endX, startY,endY]
img = cv2img[region[1]:region[3], region[0]:region[2]]

return img

区域圈图

import cv2
from typing import *

Img = NewType('cv2img', list)
Region = NewType('(startX:endX, startY,endY)', Tuple[int])
Color = NewType('(B, G, R)', Tuple[int])

def img_rect(img:Img, region:Region, border_color:Color=(0, 255, 0), border_width:int=3) -> Img:
res_img = cv2.rectangle(img, region[:2], region[2:4], border_color, border_width)
return res_img

色彩变换

色彩变换在 cv2 种是非常常用的一个操作:

cv2.cvtColor(input_image, flag)

flag:

  • cv2.COLOR_BGR2GRAY: 表示将图像从BGR空间转化成灰度图,最常用
  • cv2.COLOR_BGR2HSV: 表示将图像从RGB空间转换到HSV空间
# 列出所有COLOR_相关的flag
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)