我写这篇文章目的是记录图片分辨率不变情况下,只调节窗口尺寸,以防失真。
Opencv 读、显示、存操作
flags的值
简单的用-1,0,1来分别表示这3个flag
winname: 窗口名; image: 要显示的图片
参数:
将图像保存成指定格式的文件,注意这里的params是一个数组
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()
** 对图片窗口先进行命名并进行其他设置,如可改变窗口大小 **
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进行图片展示时,需要注意调整图片的通道顺序,因为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 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()
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))
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()
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.
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进行调用,如画线,圆圈,长方形的操作。