间隔很久再来此处记笔记,这篇笔记里也会将对前面两篇关于 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()
用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()
若为灰色图片时,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()
获得图片的属性值
- 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.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里的读,显示,存储图片,获取图片信息,调整图片大小及取得各RGB通道信息的api进行学习记录的,接下来将对opencv里的画图api进行调用,如画线,圆圈,长方形的操作。