opencv之直方图

前言

        图像直方图是根据灰度图进行绘制的,而不是彩色图像。


一、直方图

OpenCv API:

        cv2.calcHist(images, channels, mask, histSize, ranges)

参数:

        images:原图像。当传入函数时应该用中括号 [] 括起来,例如:[img]
        channels:如果输入图像是灰度图,它的值就是[0];如果是彩色图像的话,传入的参数可以是[0],[1],[2]它们分别对应着通道B,G,R。
        mask:掩模图像。要统计整幅图像的直方图就把它设为None。但是如果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并使用它。
        histSize:bins的数目。也应该用中括号括起来,例如:[256]。
        ranges:像素值范围。通常为[0,256]。

示例:

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

def histo():
    # 直接以灰度图方式读入
    img=cv2.imread('imgs/lena.png',0)

    # 创建蒙版
    mask = np.zeros(img.shape[:2], np.uint8)
    mask[100:300, 100:400] = 1

    # 统计掩膜前图像的灰度图
    hist1=cv2.calcHist([img],[0],None,[256],[0,256])

    # 统计掩膜后图像的灰度图
    img_mask=cv2.bitwise_and(img,img,mask=mask)
    hist2=cv2.calcHist([img],[0],img_mask,[256],[0,256])

    plt.figure(figsize=(12,8),dpi=100)
    plt.subplot(2,2,1)
    plt.imshow(img,cmap='gray')
    plt.title('original')
    plt.subplot(2, 2, 2)
    plt.plot(hist1)
    plt.title('hist1')
    plt.grid()
    plt.subplot(2, 2, 3)
    plt.imshow(img_mask,cmap='gray')
    plt.title('img_mask')
    plt.subplot(2, 2, 4)
    plt.plot(hist2)
    plt.title('hist2')
    plt.grid()

    plt.show()
histo()

结果:

 

 

 

二、直方图均衡化

概念:

        把原始图像的灰度直方图从比较集中的某个灰度区间变成在更广泛灰度范围内的分布,将直方图做一个横向拉伸(如下图)以扩大图像像素值的分布范围,提高图像的对比度:

 

代码如下(示例):

def equalize():
    img = cv2.imread('imgs/lena.png')
    img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    dst=cv2.equalizeHist(img)
    cv2.imshow('img',dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
equalize()

结果:


 

三、自适应的直方图均衡化

        在进行完直方图均衡化之后,图片背景的对比度确实被改变了,但均衡化之后的图像很有可能发生局部过亮或者局部过暗的情况,从而造成数据信息的丢失。

API:

clahe = cv.createCLAHE(clipLimit, tileGridSize)
dst = clahe.apply(img)

 参数:

  1. clipLimit:对比度限制,默认40
  2. tileGridSize:分块大小,默认8*8

示例:

def equlize_a():
    img = cv2.imread('imgs/lena.png')
    img=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

    # 创建一个自适应均衡化的对象,并应用于图像
    clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8))
    dst = clahe.apply(img)

    cv2.imshow('img',dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
equlize_a()

结果:

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值