返回顶部

直方图

  • 函数

    • cv2.calHist(images, channels, mask, histSize, ranges)
    • images :原图像,图像格式为 uint8 或 float32 。当传入函数时,应用中括号[],例如: [img]
    • channels:同样用中括号括起来。如果传入的是灰度图,它的值就是 [0] ,如果是彩色图像,传入的参数可以是 [0][1][2] ,他们分别对应着 BGR 。
    • mask :统计整幅图像的直方图,它的值就是 None ,但是如果你想统计图象的某一部分的直方图,你就使用掩模图像。
    • histSize : BIN 的数目。也应用中括号括起来。见右下直方图,一般BIN为256,代表0-255个值。
    • ranges :像素值范围,常为 [0256] 。

 

  •  代码示例

    •   shape介绍

import cv2 as cv
import numpy as np


img = cv.imread('cat.jpg', 0) # 0代表灰度图
hist = cv.calcHist([img], [0], None, [256], [0, 256])
hist.shape
输出:(256,1)

 

 256表示一共有256个可能的取值

1表示输出是二维的。比如说值为123的有多少个,值为234的有多少个。

    •   画图

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt


img = cv.imread('cat.jpg', 0) # 0代表灰度图
hist = cv.calcHist([img], [0], None, [256], [0, 256])
plt.hist(img.ravel(), 256)
plt.show()

 

 

    •   分别画三个通道的直方图

import cv2 as cv
import matplotlib.pyplot as plt


img = cv.imread('cat.jpg')
color = ('b', 'g', 'r')
for i,col in enumerate(color):
    histr = cv.calcHist([img], [i], None, [256], [0, 256])
    plt.plot(histr,color = col)
    plt.xlim([0, 256])

 

 

    •   mask操作

首先创建掩膜,在规定区域使之为255。

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt


img = cv.imread('cat.jpg', 0)
# 创建mask
mask = np.zeros(img.shape[:2], np.uint8) # img.shape[:2]取图像的高和宽
mask[100:300, 100:400] = 255
cv.imshow('mask', mask)
cv.waitKey(0)
cv.destroyAllWindows()

 运行结果:

 


 

再将掩膜与原图进行与运算,使之合并:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt


img = cv.imread('cat.jpg', 0)
# 创建mask
mask = np.zeros(img.shape[:2], np.uint8) # img.shape[:2]取图像的高和宽
mask[100:300, 100:400] = 255

mask_img = cv.bitwise_and(img, img, mask=mask) # 与运算,图像的合并 同一张 名字不变 但是后面的mask 是自己设置的mask
cv.imshow('mask_img', mask_img)
cv.waitKey(0)
cv.destroyAllWindows()

 

结果如下:


 

最后绘制掩膜部分的直方图:

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt


img = cv.imread('cat.jpg', 0)
# 创建mask
mask = np.zeros(img.shape[:2], np.uint8) # img.shape[:2]取图像的高和宽
mask[100:300, 100:400] = 255

mask_img = cv.bitwise_and(img, img, mask=mask) # 与运算,图像的合并 同一张 名字不变 但是后面的mask 是自己设置的mask

hist_mask = cv.calcHist([img], [0], mask, [256], [0, 256])
plt.plot(hist_mask)
plt.xlim([0, 256])
plt.show()

 

posted @ 2020-03-05 15:38  DCooo  阅读(325)  评论(0编辑  收藏  举报