Opencv-Python学习笔记三——cv2.read, cv2.resize, cv2.split, cv2.merge

间隔很久再来此处记笔记,这篇笔记里也会将对前面两篇关于 Opencv的内容有些涉及,如读写等。

Opencv 读、显示、存操作

  • cv.imread() # 读入图片
  • cv.imshow() # 显示
  • cv.imwrite() # 存储图片

cv2.imread(path[, flags])

  • flags的值

    1. cv2.IMREAD_COLOR : 读入彩色图片,任何与透明度相关通道的会被忽视,默认以这种方式读入.
    2. cv2.IMREAD_GRAYSCALE : 以灰度图的形式读入图片.
    3. cv2.IMREAD_UNCHANGED : 保留读取图片原有的颜色通道.

    简单的用-1,0,1来分别表示这3个flag

cv2.imshow(winname, image)

winname: 窗口名; image: 要显示的图片

cv2.imwrite() 保存图片

  • cv2.imwrite(filename, img[, params]) → retval

参数:

  • filename是文件名称
  • img是保存的图像

将图像保存成指定格式的文件,注意这里的params是一个数组

  • 对于JPEG,可以是有质量的保存 CV_IMWRITE_JPEG_QUALITY 从0到100,100表示最高保存质量,默认95
  • 对于WEBP, CV_IMWRITE_WEBP_QUALITY
  • 对于PNG,可以是压缩级别 CV_IMWRITE_PNG_COMPRESSION:从0到9,越小表示保存的大小越大,压缩时间越少,默认为3
  • alpha为0时表示透明,255时表示不透明
Node

cv2.waitKey()是一个键盘绑定函数。它的参数是毫秒数,这个函数会等待任意键盘事件指定的毫秒时间。如果你点了任意键,这个程序继续。如果传入0,它会一直等待按键

cv2.destroyAllWindows()销毁所有的我们创建的窗口,如果你想销毁指定的窗口,使用函数cv2.destroyWindow()你可以传指定窗口的名字作为参数。

import cv2

# 读入彩色图片
img = cv2.imread('image.jpg',cv2.IMREAD_COLOR)
# 建立image窗口显示图片
cv2.imshow('image',img)
# 无限期等待输入
k = cv2.waitKey(0)

# 如果输入ESC退出 
if k==27:
    cv2.destroyAllWindows()
# 如果输入s,保存
elif k==ord('s'):
    cv2.imwrite('test.png',img)
    # 注意cv2.IMWRITE_PNG_COMPRESSION类型为Long,必须转换成int
    outimg = cv2.imwrite("0_snap_save_0.png" , img , [ int(cv2.IMWRITE_PNG_COMPRESSION),0 ] )
    print("OK!")
    cv2.destroyAllWindows()
  

显示窗口 可调大小

cv2.namedWindow()

** 对图片窗口先进行命名并进行其他设置,如可改变窗口大小 **

  1. cv2.WINDOW_AUTOSIZE:根据原图大小进行展示
  2. cv2.WINDOW_NORMAL:图片窗口可调节大小
import cv2 

img = cv2.imread('image.jpg')
# 通过设置第二个参数使得图片窗口可调节大小,默认是不可调的(cv2.WINDOW_AUTOSIZE)
cv2.namedWindow('color', cv2.WINDOW_NORMAL)
cv2.imshow('color',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Opencv-Python学习笔记三——cv2.read, cv2.resize, cv2.split, cv2.merge_第1张图片
namedWindow展示图片

用matplotlib显示图片

调用 matplotlib进行图片展示时,需要注意调整图片的通道顺序,因为opencv读取图片的通道顺序是BGR,而matplotlib是RGB,即在调用plt.imshow之前将image的通道调整为RGB即可。

%matplotlib inline
from matplotlib import pyplot as plt
import cv2

img = cv2.imread('image.jpg')
print('图片属性: {}'.format(img.shape))

# BGR 顺序
plt.subplot(121)
plt.imshow(img)
plt.title('opencv channel order')


# 调整为 RGB
plt.subplot(122)
plt_img = img[:,:,::-1]
plt.imshow(plt_img)
plt.title('matplotlib channel order')

plt.show()
Opencv-Python学习笔记三——cv2.read, cv2.resize, cv2.split, cv2.merge_第2张图片
matplotlib图片显示

若为灰色图片时,cmap参数值设为plt.cm.gray

%matplotlib inline
from matplotlib import pyplot as plt
import cv2

img = cv2.imread('image.jpg', 0)

print(img.shape)
# cmap的值设为 plt.cm.gray
plt.imshow(img, cmap=plt.cm.gray)

plt.axis("off")
plt.show()
Opencv-Python学习笔记三——cv2.read, cv2.resize, cv2.split, cv2.merge_第3张图片
image.png

获得图片的属性值

  1. shape
  2. size
  3. dtype
import cv2
img = cv2.imread('image.jpg')
# 打印出图片一些属性值, 结构,大小,类型
print(img.shape)
print(img.size)
print(img.dtype)

# 打印出图片 某一像素处的 BGR 值
px = img[100, 100]
print(px)

# 取得 图片 某一channel的像素值
px_blue = img[100, 100, 0] # 0:blue, 1: green, 2: Red
print(px_blue)

# 修改像素值
img[100,100] = [255,255,255]
print(img[100, 100])

#  array.item() and array.itemset() 可更快获得数据及修改值
px_red = img.item(10,100,2)
print(px_red)
img.itemset((10,100,2),100)
print(img.item(10,100,2))
Opencv-Python学习笔记三——cv2.read, cv2.resize, cv2.split, cv2.merge_第4张图片
图片属性值

图像尺寸变换 cv2.resize()

  • cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]]) → dst
interpolation 选项 所用的插值方法
INTER_NEAREST 最近邻插值
INTER_LINEAR 双线性插值(默认设置)
INTER_AREA 使用像素区域关系进行重采样。
它可能是图像抽取的首选方法,因为它会产生无云纹理的结果。
但是当图像缩放时,它类似于INTER_NEAREST方法。
INTER_CUBIC 4x4像素邻域的双三次插值
INTER_LANCZOS4 8x8像素邻域的Lanczos插值

使用cv2.resize时,参数输入是 宽×高×通道

import cv2

img = cv2.imread('image.jpg')
new_img = cv2.resize(img, (800, 500), interpolation=cv2.INTER_CUBIC)
cv2.imshow('resize', new_img)
# cv2.imwrite('image800.jpg', new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
Opencv-Python学习笔记三——cv2.read, cv2.resize, cv2.split, cv2.merge_第5张图片
cv2.resize()

通道的拆分/合并处理

  • cv2.split()
  • cv2.merge()

b = img[:,:,0]
Suppose you want to set all the red pixels to zero, you do not need to split the channels first. Numpy indexing is faster.

cv.split() is a costly operation (in terms of time). So do it only if you need it. Otherwise go for Numpy indexing.

%matplotlib inline
from matplotlib import pyplot as plt
import cv2

img = cv2.imread('image800.jpg')
b,g,r = cv2.split(img)
img_merge = cv2.merge((r,g,r))
# img = cv2.merge((b,g,r))
print(b.shape)
print(b[:3])

plt.subplot(121)
plt.imshow(img[:,:, ::-1])
# img = cv2.merge((r,g,b))
# plt.imshow(img)
plt.title('origin pic')

plt.subplot(122)
plt.imshow(img_merge)
plt.title('merge r to b')

plt.show()

# cv2.imshow('color',img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
Opencv-Python学习笔记三——cv2.read, cv2.resize, cv2.split, cv2.merge_第6张图片
cv2.split()

本篇笔记主要通过对opencv里的读,显示,存储图片,获取图片信息,调整图片大小及取得各RGB通道信息的api进行学习记录的,接下来将对opencv里的画图api进行调用,如画线,圆圈,长方形的操作。

你可能感兴趣的:(Opencv-Python学习笔记三——cv2.read, cv2.resize, cv2.split, cv2.merge)