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

获得图片的属性值

  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))
图片属性值

图像尺寸变换 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进行调用,如画线,圆圈,长方形的操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,423评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,147评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,019评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,443评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,535评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,798评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,941评论 3 407
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,704评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,152评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,494评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,629评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,295评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,901评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,742评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,978评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,333评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,499评论 2 348

推荐阅读更多精彩内容