数字图像处理【1】 图像读写及显示操作

 博客主页: 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主要模块

数字图像处理【1】 图像读写及显示操作_第1张图片

二、图像读写及显示操作

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

 (1)读取图像

cv.IMREAD_COLOR: 加载彩色图像。任何图像的透明度都会被忽视。它是默认标志。
cv.IMREAD_GRAYSCALE:以灰度模式加载图像。
cv.IMREAD_UNCHANGED:加载彩色图像,包括 alpha 通道(透明度)。
可以分别简单地 用整数 1、0 或-1 表示
import cv2
import cv2 as cv
img1 = 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 函数类型

数字图像处理【1】 图像读写及显示操作_第2张图片

(2)显示图像

使用函数 cv.imshow()在窗口中显示图像。窗口自动适合图像尺寸。有 两个参数 ,第一个参
数是 窗口名称 ,它是一个字符串。第二个参数是 显示的对象
#显示图像
cv.imshow('image',img1)
cv.waitKey(0)#无限期的等待一次敲击键,如果这段时间按下任何键,程序将继续运行
cv.destroyAllWindows()#关闭所有打开的窗口

数字图像处理【1】 图像读写及显示操作_第3张图片(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])

数字图像处理【1】 图像读写及显示操作_第4张图片

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

import numpy
import  cv2 as cv

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

(4)图像的像素式存储

       需要注意的是 ,由于历史遗留问题,opencv 采用 BGR 模式 ,而 不是 RGB。 有两种方式获取像素值
import cv2 as cv
img = cv.imread('cat1.png')

#第一种方式
pixel = img[100,100]#取一个像素点
#opencv采用bgr
b = 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] =99
print("修改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])

数字图像处理【1】 图像读写及显示操作_第5张图片

(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()

数字图像处理【1】 图像读写及显示操作_第6张图片数字图像处理【1】 图像读写及显示操作_第7张图片

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

有时需要分别处理图像的 B G R 通道。在这种情况下,需要将 BGR 图 像拆分为单个通道。在其他情况下,可能需要将这些单独的通道加入 BGR 图片。
#截取蓝色通道
b = img[:,:,0]
print(b)
#截取三个通道
b,g,r = cv.split(img)
print(b)
print(g)
print(r)

数字图像处理【1】 图像读写及显示操作_第8张图片数字图像处理【1】 图像读写及显示操作_第9张图片(时间较长)

蓝色像素置为0:

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

数字图像处理【1】 图像读写及显示操作_第10张图片

绿色通道设置为0:

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

数字图像处理【1】 图像读写及显示操作_第11张图片

红色通道设置为0

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

数字图像处理【1】 图像读写及显示操作_第12张图片

(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)

数字图像处理【1】 图像读写及显示操作_第13张图片

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)

数字图像处理【1】 图像读写及显示操作_第14张图片

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

你可能感兴趣的:(数字图像处理,图像处理,python,opencv)