RGB图像灰度直方图的绘制

一、描述

一幅图像的整个直方图我们一般不难画,本篇分享一下三通道分开的灰度直方图,包含三个分开的和三个画在一起的。

二、代码编写

 三通道灰度直方图绘制代码(含解释)Opencv中的cv2.calcHist()函数的作用及返回值 - 百度文库 (baidu.com)

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("./img/apple.jpg", 1)  # 0是直接以灰度图方式读入,1是彩色图这里为BGR

cv2.imshow("yuantu", img) #显示读取的图

'''
# 统计灰度图
greyScale_map = cv2.calcHist([img], [0], None, [256], [0, 256])
# 绘制灰度图直方图,以上的[0]可以换成[1]或者[2],表示不同通道的,如果输入是灰度图单通道写[0]。

plt.figure(figsize=(10, 6), dpi=100)
plt.plot(greyScale_map)
plt.title('G')
plt.grid()
plt.show()
'''

color = ('b', 'g', 'r')
#hists = []
for i, col in enumerate(color):
    greyScale_map = cv2.calcHist([img], [i], None, [256], [0, 256])
    plt.plot(greyScale_map, color=col)
    plt.xlim([0, 256]) #横坐标范围
#plt.xlabel("像素值")
plt.title('huiduzhiftu')
plt.show()

cv2.waitKey()
cv2.destroyAllWindows()

三、补充知识

1、cv2.imread(filename, flags)

参数:   

 filepath:读入imge的完整路径 

 flags:标志位,{cv2.IMREAD_ _COLOR, cv2.IMREAD_ _GRAYSCALE, cv2.IMREAD_ UNCHANGED}

cv2.IMREAD_ COLOR:默认参数,读入-副彩色图片,忽略alpha通道, 可用1作为实参 替代
cv2.IMREAD_ GRAYSCALE:读入灰度图片,可用0作为实参 替代
cv2.IMREAD_ _UNCHANGED:顾名思义,读入完整图片,包括alpha通道, 可用-1作为实参 替代
PS: alpha通道,又称A通道, 是一个8位的灰度通道,该通道用256级灰度来记录图像中的透明度复信息,定义透明、不透明和半透明区域,其中黑表示全透明,白表示不透明,灰表示半透明

2、关于RGB,BGR等区别

使用 scipy.misc.imread 读取的图片数据是 RGB 格式;
使用 cv2.imread 读取的图片数据是 BGR 格式;
使用 PIL.Image.open 读取的图片数据是RGB格式;

代码中:

img = cv2.imread("./img/apple.jpg", 1)  # 0是直接以灰度图方式读入,1是彩色图这里为BGR

###  为什么要使用BGR?RGB图像转换为BGR_yaoyz105的博客-CSDN博客_rgb转bgr
早前 windows 下,不管是摄像头制造者,还是软件开发者,当时流行的都是 BGR 格式的数据结构,后面 RBG 格式才逐渐开始流行,所以当时的 opencv 选择了使用 BGR 格式,这个是 opencv 在发展过程中的历史遗留问题。

而 Caffe 作为最早流行的代表,它又基于 opencv,所以也跟着使用了 BGR。

其实自己训练的时候完全可以使用 RGB,新库也不存在是 RGB 还是 GBR 这个问题。但如果使用的是别人训练好的模型,就要注意一下使用的是 RGB 还是 GBR。

四、结果显示

代码:代码都写成了函数形式,需要加读取图像和最后调用函数出图

1、读取图像:

img = cv2.imread("./img/apple.jpg", 1)
# cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
cv2.imshow('yuantu', img)#显示读取的图

2、函数图 

def zuhetu(img):#组合一起画b, g, r的灰度直方图
    color = ('b', 'g', 'r')
    for i, col in enumerate(color):
        greyScale_map = cv2.calcHist([img], [i], None, [256], [0, 256])
        plt.plot(greyScale_map, color=col)
        plt.xlim([0, 256]) #横坐标范围
    #plt.xlabel("像素值")
    plt.title('zuhe')
    plt.show()

3、调用函数出图

zuhetu(img)

 分开的绘图的代码:其读取图和调用函数一样

# 绘制灰度图
def plotcalcHist(img):#分别画b, g, r的 灰度图 和 灰度直方图

    # 三通道灰度直方图绘制,如果是灰度图直接写 [0]。
    # 绘制灰度图直方图,以上的[0]可以换成[1]或者[2],表示不同通道的,如果输入是灰度图单通道写[0]。
    greyScale_b = cv2.calcHist([img], [0], None, [256], [0, 256])  # b
    greyScale_g = cv2.calcHist([img], [1], None, [256], [0, 256])  # g
    greyScale_r = cv2.calcHist([img], [2], None, [256], [0, 256])  # r

    plt.figure(1)
    # 第一行第一列图形
    ax1 = plt.subplot(2, 4, 1)
    plt.sca(ax1)
    plt.imshow(img)
    plt.title("RGB")
    # 第一行第二列图形
    ax2 = plt.subplot(2, 4, 2)
    plt.sca(ax2)
    plt.imshow(img[:, :, 0], cmap="gray")
    plt.title("B")

    # 第一行第3列图形
    ax3 = plt.subplot(2, 4, 3)
    plt.sca(ax3)
    plt.imshow(img[:, :, 1], cmap="gray")
    plt.title("G")
    # 第一行第4列图形
    ax4 = plt.subplot(2, 4, 4)
    plt.sca(ax4)
    plt.imshow(img[:, :, 2], cmap="gray")
    plt.title("R")

    # ax5 = plt.subplot(2, 4, 5)
    # ax5.plot(zuhetu(img))  # 绘制图
    # plt.tick_params(direction='in')  # 刻度向里

    ax6 = plt.subplot(2, 4, 6)
    ax6.plot(greyScale_b, color='b')  # 绘制图
    plt.title('B')
    plt.tick_params(direction='in')  # 刻度向里

    #plt.xlabel('year'), plt.ylabel('density'), plt.legend(loc=4)

    ax7 = plt.subplot(2,4,7)
    ax7.plot(greyScale_g,color='g')  # 绘制图
    plt.title('G')
    plt.tick_params(direction='in')  # 刻度向里

    ax8 = plt.subplot(2, 4, 8)
    ax8.plot(greyScale_r, color='r')  # 绘制图
    plt.title('R')
    plt.tick_params(direction='in')  # 刻度向里
    plt.show()

    # plt.figure(2)#单独画三个rgb的直方图
    plt.figure(figsize=(15, 6), dpi=100)
    ax6 = plt.subplot(131)
    ax6.plot(greyScale_r, color='r')  # 绘制图
    plt.title('R')
    plt.tick_params(direction='in')  # 刻度向里
    # plt.xlabel('year'), plt.ylabel('density'), plt.legend(loc=4)

    ax7 = plt.subplot(132)
    ax7.plot(greyScale_g, color='g')  # 绘制图
    plt.title('G')
    plt.tick_params(direction='in')  # 刻度向里

    ax8 = plt.subplot(133)
    ax8.plot(greyScale_b, color='b')  # 绘制图
    plt.title('B')
    plt.tick_params(direction='in')  # 刻度向里

    plt.show()
    # cv2.imwrite('./img/1111.jpg',img[:, :, 1])

 

  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彩色面团儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值