打印图像直接用这个函数:
import cv2 #opencv读取的格式是BGR
import numpy as np
import matplotlib.pyplot as plt#Matplotlib是RGB
%matplotlib inline
def cv_show(img,name):
cv2.imshow(name,img)
cv2.waitKey()
cv2.destroyAllWindows()
1、直方图
1.1 基本定义
图像中的直方图概念,将图像分解成像素点,直方图对像素点进行统计。
如左图读进来一个灰度图,用数值的形式展示出来,直方图就是统计0-255个像素值的分布情况,其中横坐标是0-255的像素值,纵坐标是每个像素值出现的次数。
需要用到这个函数:cv2.calcHist(images,channels,mask,histSize,ranges)
- images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如**[img]**
- channels: 同样用中括号括来它会告函数我们统幅图像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的参数可以是 [0] [1] [2] 它们分别对应着 BGR。
- mask: 掩码图像。统整幅图像的直方图就把它为 None。但是如果你想统图像某一分的直方图的你就制作一个掩码图像并使用它。
- histSize:BIN的数目,也就是你需要多少根柱子,函数会自动按照柱子个数将取值范围均匀分布进去,也要用中括号括起来。
- ranges: 像素值范围常为 [0,256],python左闭右开嘛
所以后面两个参数基本不用改了。
1.2 代码实例
读进来一个小猫的灰度图,获取像素统计信息:
img = cv2.imread('cat.jpg',0) #0表示灰度图
hist = cv2.calcHist([img],[0],None,[256],[0,256])
print(hist.shape)
hist就是一个二维的ndarray,打印结果:
(256, 1)
将这个直方图用matplotlib画出来:
plt.hist(img.ravel(),256);
plt.show()
打印结果:
将刚刚的小猫图对三个颜色通道都进行统计:
img = cv2.imread('cat.jpg')
color = ('b','g','r')
for i,col in enumerate(color):
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
plt.xlim([0,256])
打印结果:
2 mask操作
怎样创建一个掩码,以及掩码的定义:
# 创建mast
mask = np.zeros(img.shape[:2], np.uint8)
print (mask.shape)
mask[100:300, 100:400] = 255
cv_show(mask,'mask')
打印结果:
(414, 500)