OpenCV10:彩色图片直方图&灰度图片直方图(源码实现非调用方法)

直方图的本质:统计每个像素灰度出现的概率,所以它的横坐标为0-255,是灰度等级
纵坐标为其出现频率。

首先是彩色图片的直方图,画的是rgb三元色的直方图,代码如下:

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

img = cv2.imread('OpenCV\\image0.JPG',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# 分别求b,g,r出现的概率
count_b = np.zeros(256, np.float)
count_g = np.zeros(256, np.float)
count_r = np.zeros(256, np.float)
for i in range(height):
    for j in range(width):
        (b,g,r) = img[i,j]    
        index_b = int(b)    # 将np. 数据类型转换为int
        index_g = int(g)
        index_r = int(r)
        count_b[index_b] = count_b[index_b] + 1
        count_g[index_g] = count_g[index_g] + 1
        count_r[index_r] = count_r[index_r] + 1
for i in range(256):
    count_b[i] = count_b[i]/(height*width)
    count_g[i] = count_g[i]/(height*width)
    count_r[i] = count_r[i]/(height*width)

# 定义x轴坐标
x = np.linspace(0,255,256)

# 绘制图像 
y1 = count_b
plt.figure()
plt.bar(x, y1, 0.9, alpha=1, color='b')

y2 = count_g
plt.figure()
plt.bar(x, y2, 0.9, alpha=1, color='g')

y3 = count_r
plt.figure()
plt.bar(x, y3, 0.9, alpha=1, color='r')

plt.show()

# 优化后的绘图
# 绘制图像 
plt.figure(figsize=(25,5))    # figsize调整图像大小
ax1 = plt.subplot(1,3,1)      # 一行三列的子图的第一个位置
ax2 = plt.subplot(1,3,2)
ax3 = plt.subplot(1,3,3)

# 调整子图之间的间距
plt.tight_layout(pad=0.4, w_pad=5, h_pad=1.0)

plt.sca(ax1)    # 选择 ax1
y1 = count_b
plt.bar(x, y1, 0.9, alpha=1, color='b')

plt.sca(ax2)    # 选择 ax2
y2 = count_g
plt.bar(x, y2, 0.9, alpha=1, color='g')

plt.sca(ax3)    # 选择 ax3
y3 = count_r
plt.bar(x, y3, 0.9, alpha=1, color='r')

plt.show()

优化后的绘图:

下面是灰度图像直方图。

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

img = cv2.imread('OpenCV\\image0.JPG', 1)
ImgInfo = img.shape
height = ImgInfo[0]
width = ImgInfo[1]

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
count = np.zeros(256, np.float)    # 建立一个大小为256的数组

for i in range(height):
    for j in range(width):
        pixel = gray[i,j]    # 图像中像素值的类型是np.uint8
        index = int(pixel)
        # 0-255的下标,意味着0-255的灰度等级,每当符合其灰度等级,就在count数组中的对应位置加一
        count[index] = count[index] + 1
# 计算每种灰度出现的概率
for i in range(255):
    count[i] = count[i]/(height*width)

# 用matplot绘图
x = np.linspace(0,255,256)
y = count
plt.bar(x, y, width=0.8, alpha=1, color='b')
plt.show()

结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值