Bootstrap

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

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

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

cv2.imread(path[, flags])

flags的值

cv2.IMREAD_COLOR : 读入彩色图片,任何与透明度相关通道的会被忽视,默认以这种方式读入.
cv2.IMREAD_GRAYSCALE : 以灰度图的形式读入图片.
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()
** 对图片窗口先进行命名并进行其他设置,如可改变窗口大小 **

cv2.WINDOW_AUTOSIZE:根据原图大小进行展示
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()

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

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

image.png

获得图片的属性值

shape
size
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))

图片属性值

图像尺寸变换 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()

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

cv2.split()

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

作者:深思海数_willschang
链接:https://www.jianshu.com/p/ed00179ede34
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

;