分享

python+opencv图像处理(十四)

 pythonjava学习 2021-04-06
图像直方图
1、灰度图像的直方图
灰度图像的直方图是灰度级和这种灰度级的概率之间关系的图形。
直接看图,下图中左侧是原图,右图为其直方图。

完整代码如下:

import cv2 as cv

import matplotlib.pyplot as plt

def his(img,b):#matplotlib画图

    plt.figure("histogram")

    plt.title("histogram of lena")

    plt.hist(img.ravel(),bins=b)

    plt.show()

imge=cv.imread(r'E:\\image\\lenagray.jpg')

img=cv.cvtColor(imge,cv.COLOR_RGB2GRAY)

cv.imshow('lena',img)

his(img,256)

cv.waitKey(0)

cv.destroyAllWindows()

也可以用opencv自带的函数calcHist()来画直方图,结果如下所示:

我只贴了自定义的函数代码如下:

def his(img,bin):#基于opencv API

   hist = cv.calcHist([img],[0],None,[256],[0,255])

   plt.plot(hist,'r')

   plt.show()

此段函数的调用过程和上面的代码是一样一样的。
函数calcHist()的使用方法百度一搜一大把

------------------------------代码理解了吗,休息一下吧

------------------------------我是广告开始的分隔线

--------------------------------我是广告结束的分隔线

2、彩色图像的直方图
灰度图像只有一个通道,一般我们画的是灰度图像的直方图。
如果要画彩色图像的直方图,因为彩色图像有三个通道,其实就是将三个通道分别来画直方图并叠加在一起即可。
如下例所示:

其代码如下:

import cv2 as cv

import matplotlib.pyplot as plt

import matplotlib as mpl

mpl.rcParams['font.sans-serif']=['SimHei'] #指定默认字体 SimHei为黑体

mpl.rcParams['axes.unicode_minus']=False #用来正常显示负号

def image_hist(image):     #画三通道图像的直方图

    color = ('b', 'g', 'r')   #这里画笔颜色的值可以为大写或小写或只写首字母或大小写混合

    for i , color in enumerate(color):

        hist = cv.calcHist([image], [i], None, [256], [0, 256])  #计算直方图

        plt.plot(hist, color)

        plt.xlim([0, 256])

        plt.title("lena的直方图,不同颜色是不同通道")

    plt.show()

img=cv.imread(r'E:\\image\\lena.jpg')

cv.imshow('image',img)

image_hist(img)

cv.waitKey(0)

cv.destroyAllWindows()

3、掩膜直方图
图像的掩膜就是用选定的图像、图形或物体,对处理的图像进行遮挡,来控制图像处理的区域或处理过程。
还是先上图:

其完整代码如下:

import cv2 as cv

import numpy as np

import matplotlib.pyplot as plt

import matplotlib as mpl

mpl.rcParams['font.sans-serif']=['SimHei'] #指定默认字体 SimHei为黑体

mpl.rcParams['axes.unicode_minus']=False #用来正常显示负号

img = cv.imread('E:\\image\\lena.jpg', 0)

# create a mask  应用掩膜

mask = np.zeros(img.shape[:2], np.uint8)#img大小相同

mask[100:300, 100:400] = 255#部分位置全黑

masked_img = cv.bitwise_and(img, img, mask=mask)#掩膜后的图像,由原图与掩膜相与得到

hist_full = cv.calcHist([img], [0], None, [256], [0,256])#画原图的直方图

hist_mask = cv.calcHist([img], [0], mask, [256], [0,256])#画掩膜的直方图

plt.subplot(221), plt.imshow(img, 'gray'),plt.title("原图")

plt.subplot(222), plt.imshow(mask,'gray'),plt.title("掩膜")

plt.subplot(223), plt.imshow(masked_img, 'gray'),plt.title("掩膜后的图")

plt.subplot(224), plt.plot(hist_full, color='r'), plt.plot(hist_mask, color='b')

plt.title("红色为原图直方图,蓝色为掩膜的直方图")

plt.xlim([0,256])

plt.tight_layout()

plt.show()

    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多