博客主页:A_SHOWY
系列专栏:力扣刷题总结录数据结构云计算数字图像处理

一、OpenCV简介(前置)

(1)OpenCV简介

OpenCV 是一个跨平台开源计算机视觉库,提供了 Python 接口,包含了数字图像处理和计算机视觉方面很多通用算法。

(2)Python安装 Opencv

首先需要安装 NumPy,然后再安 装 OpenCV,可以选择两种不同版本: 仅安装主模块包: pip install opencv-python

安装完整包(包括主模块和附加模块) :pip install opencv-c

为加快安装速度可选取国内源安装,比如采用下面的命令安装: pip install matplotlib -i https://pypi.tuna.tsinghua.edu.cn/simple/ pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple/

(3)Opencv主要模块

二、图像读写及显示操作

对于 python 而言,在引用 opencv 库的时候可写为 import cv2 as cv

(1)读取图像

cv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。 cv.IMREAD_GRAYSCALE:以灰度模式加载图像。 cv.IMREAD_UNCHANGED:加载彩色图像,包括 alpha 通道(透明度)。 可以分别简单地用整数 1、0 或-1 表示

import cv2import cv2 as cvimg1 = cv.imread('2.png',1)img2 = cv.imread('2.png',0)rows,cows,chn = img1.shape #宽高和通道数size = img1.size # 像素数目print('image shape',rows,cows,chn)print('image size',size)print('image type',img1.dtype) # dtype 函数类型

(2)显示图像

使用函数 cv.imshow()在窗口中显示图像。窗口自动适合图像尺寸。有 两个参数 ,第一个参 数是 窗口名称 ,它是一个字符串。第二个参数是 显示的对象

#显示图像cv.imshow('image',img1)cv.waitKey(0)#无限期的等待一次敲击键,如果这段时间按下任何键,程序将继续运行cv.destroyAllWindows()#关闭所有打开的窗口

(3)保存图像

  • 使用函数 cv.imwrite()保存图像。第一个参数是文件名,第二个参数是要保存的图像,图像并以指定格式保存在工作目录中。
  • 对于 JPEG,其表示的是图像的质量,用 0-100 的整数表示, 默认为 95。 注意,cv2.IMWRITE_JPEG_QUALITY 类型为 Long,必须转换成 int。
  • 对于 PNG ,第三个参数表示的是压缩级别。cv2.IMWRITE_PNG_COMPRESSION,从 0 到 9,压缩 级别越高,图像尺寸越小。默认级别为 3
    #保存图像cv.imwrite('cat1.png',img1,[int(cv.IMWRITE_PNG_COMPRESSION),0])cv.imwrite('cat2.png',img1,[int(cv.IMWRITE_PNG_COMPRESSION),9])

练习:以灰度加载图像,显示图像,按 s 保存图像并退出,或者按 ESC 键直接退出而不保存

import numpyimportcv2 as cvimg = cv.imread('cat1.png',0)#读取图像,以灰度加载cv.imshow('image',img)#显示图像k = cv.waitKey(0)#等待敲击if(k == 27):#如果是esccv.destroyAllWindows()#关掉elif(k == ord('s')):#如果是scv.imwrite('cat3.png',img,[int(cv.IMWRITE_PNG_COMPRESSION),1])#保存cv.destroyAllWindows()#关掉

(4)图像的像素式存储

需要注意的是,由于历史遗留问题,opencv 采用 BGR 模式,而不是 RGB。有两种方式获取像素值

import cv2 as cvimg = cv.imread('cat1.png')#第一种方式pixel = img[100,100]#取一个像素点#opencv采用bgrb = img[100,100,0]g = img[100,100,1]r = img[100,100,2]print("修改blue前:b:{},g:{},r:{}".format(b,g,r))img[100,100,0] =99print("修改blue后:b:{},g:{},r:{}".format(b,g,img[100,100,0]))#第二种方式获取像素值设施像素值pixel = img.item(100,100,2)print(pixel)img.itemset((100,100,2),100)print(b,g,img[100,100,2])

(5)ROI截取

roi = img[150:250,300:400]#截取150行到250行,300列到400列的像素img[50:150,200:300] = roi#将截取的roi放到这个区域cv.imshow('image',img)cv.waitKey(0)cv.destroyAllWindows()

(6)拆分和合并图像通道

有时需要分别处理图像的 BGR 通道。在这种情况下,需要将 BGR 图 像拆分为单个通道。在其他情况下,可能需要将这些单独的通道加入 BGR 图片。

#截取蓝色通道b = img[:,:,0]print(b)#截取三个通道b,g,r = cv.split(img)print(b)print(g)print(r)

(时间较长)

蓝色像素置为0:

img[:,:,0] = 0cv.imshow('image',img)cv.waitKey(0)cv.destroyAllWindows()

绿色通道设置为0:

img[:,:,1] = 0cv.imshow('image',img)cv.waitKey(0)cv.destroyAllWindows()

红色通道设置为0

img[:,:,2] = 0cv.imshow('image',img)cv.waitKey(0)cv.destroyAllWindows()

(7)按比例缩放

1.固定比例缩放

#固定比例缩放img = cv.imread('cat1.png',1)cv.imshow('catyuan',img)cv.waitKey(0)img = cv.resize(img,None,fx=0.5,fy=0.5)cv.imshow('catxin',img)cv.waitKey(0)

2.固定长度缩放

#固定长度缩放img = cv.imread('cat1.png',1)cv.imshow('catyuan',img)cv.waitKey(0)img = cv.resize(img,(300,300))cv.imshow('catxin',img)cv.waitKey(0)

dsize 形参的数组的宽度在前,高度在后(output_width,output_height)图像缩放之后,肯定像素要进行重新计算的,就靠 interpolation 这个参数来指定重新计算 像素的方式,有以下几种: INTER_NEAREST – 最邻近插值 INTER_LINEAR – 双线性插值,如果最后一个参数你不指定,默认使用这种方法 INTER_CUBIC – 4×4 像素邻域内的双立方插值 INTER_LANCZOS4 – 8×8 像素邻域内的 Lanczos 插值默认使用双线性插值法