Python+OpenCV图像处理之图像直方图

摘要:
对于i,colornennumerate:hist=cv2.calcHistplt.plotplt.xlimpl。show()if__name__==“__main__”:img=cv2.imreadcv2.namedWindowcv2.imshowplot_demoimage_hist_Democv2.waitKeycv2.destroyAllWindows()运行结果:(2)直方图应用直方图均衡是一种在图像处理领域使用图像直方图调整对比度的方法,并且是图像增强的一种方法Python code importcv2_ author__=“Boboa”#全局直方图均衡defequal_ hist_Demo:gray=cv2.cvtClordst=cv2.equalizationHistcv2.imshow#局部直方图均衡defclahe_ Demo:gray=cv2.cvtclorclahe=cv2.createCLAHEdst=clahe.applyv2.imshowif_ name __=“__main__”:img=cv2.imreadcv2.namedWindowcv2.imshowequal_ hist_Democv2。waitKeycv2.destroyAllWindows()全局直方图均衡化操作结果:局部直方图均衡化结果:直方图比较:在对两幅输入图像执行直方图均衡化和直方图计算步骤后,我们可以比较两幅图像的直方图,并通过比较结果得出我们想要的一些结论。

(一)图像直方图

要画直方图必须要安装matplotlib库,Matplotlib 是一个 Python 的 2D绘图库。

图像直方图是反映一个图像像素分布的统计表,其横坐标代表了图像像素的种类,可以是灰度的,也可以是彩色的。纵坐标代表了每一种颜色值在图像中的像素总数或者占所有像素个数的百分比。图像是由像素构成,因为反映像素分布的直方图往往可以作为图像一个很重要的特征。直方图的显示方式是左暗又亮,左边用于描述图像的暗度,右边用于描述图像的亮度

python代码

import cv2
from matplotlib import pyplot as plt


def plot_demo(image):
    # numpy的ravel函数功能是将多维数组降为一维数组
    plt.hist(image.ravel(), 256, [0, 256])
    plt.show("直方图")


def image_hist_demo(image):
    color = {"blue", "green", "red"}
    # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据下标和数据,一般用在 for 循环当中。
    for i, color in enumerate(color):
        hist = cv2.calcHist([image], [i], None, [256], [0, 256])
        plt.plot(hist, color=color)
        plt.xlim([0, 256])
    plt.show()


if __name__ == "__main__":
    img = cv2.imread("img6.jpg")
    cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
    cv2.imshow("input image", img)
    plot_demo(img)
    image_hist_demo(img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

运行结果:

Python+OpenCV图像处理之图像直方图第1张

(二)直方图应用

直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法,是图像增强的一个手段

python代码

import cv2


__author__ = "boboa"


# 全局直方图均衡化
def equal_hist_demo(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    dst = cv2.equalizeHist(gray)
    cv2.imshow("equal_hist_demo", dst)


# 局部直方图均衡化
def clahe_demo(image):
    gray = cv2.cvtColor(image, cv2.COLOR_BGRA2GRAY)
    clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
    dst = clahe.apply(gray)
    cv2.imshow("clahe_demo", dst)


if __name__ == "__main__":
    img = cv2.imread("img7.jpg")
    cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
    cv2.imshow("input image", img)
    equal_hist_demo(img)
    clahe_demo(img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

全局直方图均衡化运行结果:

Python+OpenCV图像处理之图像直方图第2张

局部直方图均衡化运行结果:

Python+OpenCV图像处理之图像直方图第3张

直方图比较:对输入的两张图像进行直方图均衡化及直方图计算步骤后,可以对两个图像的直方图进行对比,并通过对比的结果得到一些我们想要的结论。

 python代码

import cv2
import numpy as np


__author__ = "boboa"


def create_rgb_hist(image):
    h, w, c = image.shape
    rgbHist = np.zeros([16*16*16, 1], np.float32)
    bsize = 256/16
    for row in range(h):
        for col in range(w):
            b = image[row, col, 0]
            g = image[row, col, 1]
            r = image[row, col, 2]
            index = np.int(b/bsize)*16*16 + np.int(g/bsize)*16 + np.int(r/bsize)
            rgbHist[np.int(index), 0] = rgbHist[np.int(index), 0]+1
    return rgbHist


def hist_compare(image1, image2):
    hist1 = create_rgb_hist(image1)
    hist2 = create_rgb_hist(image2)
    match1 = cv2.compareHist(hist1, hist2, cv2.HISTCMP_BHATTACHARYYA)
    match2 = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CORREL)
    match3 = cv2.compareHist(hist1, hist2, cv2.HISTCMP_CHISQR)
    # 巴氏距离越小越相似,相关性越大越相似,卡方越大越不相似
    print("巴氏距离", match1)
    print("相关性", match2)
    print("卡方", match3)


if __name__ == "__main__":
    img1 = cv2.imread("img5.jpg")
    img2 = cv2.imread("img6.jpg")
    cv2.imshow("img1", img1)
    cv2.imshow("img2", img2)
    hist_compare(img1, img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

运行结果

Python+OpenCV图像处理之图像直方图第4张

(三)直方图反向投影

根据样本的直方图,找到图像与样本相似的地方,即反向投影技术。Opencv中文网站这样说:所谓反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的该特征。

python代码

import cv2
from matplotlib import pyplot as plt


__author__ = "boboa"


def hist2d_demo(image):
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    hist = cv2.calcHist([image], [0, 1], None, [180, 256], [0, 180, 0, 256])
    cv2.imshow("hist2d", hist)
    plt.imshow(hist, interpolation="nearest")
    plt.title("2d histogram")
    plt.show()


def back_projection_demo():  # 直方图反向投影
    sample = cv2.imread("sample.jpg")
    target = cv2.imread("target.jpg")
    roi_hsv = cv2.cvtColor(sample, cv2.COLOR_BGR2HSV)
    target_hsv = cv2.cvtColor(target, cv2.COLOR_BGR2HSV)

    cv2.imshow("sample", sample)
    cv2.imshow("target", target)

    roihist = cv2.calcHist([roi_hsv], [0, 1], None, [32, 32], [0, 180, 0, 256])
    cv2.normalize(roihist, roihist, 0, 255, cv2.NORM_MINMAX)  # 归一化
    dst = cv2.calcBackProject(target_hsv, [0, 1], roihist, [0, 180, 0, 256], 1)
    cv2.imshow("backproject", dst)


if __name__ == "__main__":
    img = cv2.imread("target.jpg")
    # cv2.namedWindow("input image", cv2.WINDOW_AUTOSIZE)
    # cv2.imshow("input image", img)
    # hist2d_demo(img)
    back_projection_demo()
    cv2.waitKey(0)
    cv2.destroyAllWindows()

反向投影用于在输入图像(通常较大)中查找特定图像(通常较小或者仅1个像素,以下将其称为模板图像)最匹配的点或者区域,也就是定位模板图像出现在输入图像的位置。

免责声明:文章转载自《Python+OpenCV图像处理之图像直方图》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇flutter 生成aar文件,嵌入原生android项目Robots.txt 协议详解及使用说明下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

vue配置请求转发解决跨域问题

通过nodejs的请求转发到后台,前端地址:http://localhost:8080 后端地址:http://localhost:8081 vue.config.js内容如下: let proxyObj={} proxyObj['/']={ //websocket ws:false, target:'http://localho...

python之PIL库(Image模块)

PIL(Python Image Library)是python的第三方图像处理库,PIL的功能非常的强大,几乎被认定是Python的官方图像处理库了。 由于PIL仅支持到python2.7于是一群志愿者在PIL的基础上创建了兼容的版本,名字叫Pillow,支持最新的python3,而且扩容了很多特性,所以在python3我们可以直接安装Pillow。 我...

使用mui实现长按保存图片

转自:https://blog.csdn.net/qq_36676237/article/details/81533124 首先初始化mui(longtap是我们要用到的,longtap默认为false,如果没有初始化为true,则长按事件无效)mui.init( { gestureConfig:{tap: true, //默认为truedoubletap...

python之线程与线程池

# 进程是资源分配的最小单位,线程是CPU调度的最小单位.每一个进程中至少有一个线程。 # 传统的不确切使用线程的程序称为只含有一个线程或单线程程序,而可以使用线程的程序被称为多线程程序,在程序中使用一个线程的方法 # 被称为多线程 # 线程的模块: # thread >> 实现线程的低级接口 # threading>>>...

卡常头文件

#pragma GCC optimize("Ofast") #pragma GCC target("sse3","sse2","sse") //#pragma GCC target("avx","sse4","sse4.1","sse4.2","ssse3") //#pragma GCC target("f16c") //#pragma GCC targe...

二分法其实很简单,为什么老是写不对!!

文章持续更新,微信搜索「代码随想录」第一时间围观,本文GitHub:https://github.com/youngyangyang04/TechCPP已经收录,里面有更多干货等着你,欢迎Star! 相信很多人对二分法是又爱又恨,爱是在于它思想简单,效率确实高, 恨是恨在为什么总是写不对呢 二分查找涉及的很多的边界条件,逻辑比较简单,就是写不好 甚至有的同...