Open CV系列学习笔记(九)直方图应用 2021-02-03

news/2024/7/8 4:01:17

Open CV系列学习笔记(九)直方图应用

直方图均衡化

在统计学中,直方图(英语:Histogram)是一种对数据分布情况的图形表示,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量。直方图是品质管理七大工具之一。把直方图上每个属性的计数除以所有属性的计数之和,就得到了归一化直方图。之所以叫“归一”,是因为归一化直方图的所有属性的计数之和为1,也就是说,每个属性对应计数都是0到1之间的一个数(百分比)。
这种方法通常用来增加许多图像的全局对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。
这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是可逆操作,如果已知均衡化函数,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景噪声的对比度并且降低有用信号的对比度。
在这里插入图片描述

直方图均衡化(亮度增强)

代码:

def equalHist_demo(image):#直方图均衡化亮度增强
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    dst = cv.equalizeHist(gray)
    cv.imshow("equalHist_dome",dst)

结果:
在这里插入图片描述

局部直方图均衡化

代码:可以自行控制调节亮度大小

def clahe_demo(image):#直方图均衡化
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    clahe = cv.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8))
    dst = clahe.apply(gray)
    cv.imshow("clahe_demo", dst)

结果:
在这里插入图片描述

相关性

代码:

def create_rgb_hist(image):#创建3通道rgb直方图
    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 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)
    match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)
    match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)
    print("巴氏距离: %s, 相关性: %s, 卡方: %s"%(match1, match2, match3))

结果:
在这里插入图片描述
--------HEllow Python-------
巴氏距离: 0.8490919257742504, 相关性: 0.044899764797159916, 卡方: 5201437.71497856
完整代码:

import cv2 as cv
import numpy as np


def equalHist_demo(image):#直方图均衡化亮度增强
    gray = cv.cvtColor(image,cv.COLOR_BGR2GRAY)
    dst = cv.equalizeHist(gray)
    cv.imshow("equalHist_dome",dst)


def clahe_demo(image):#直方图均衡化
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    clahe = cv.createCLAHE(clipLimit=3.0, tileGridSize=(8, 8))
    dst = clahe.apply(gray)
    cv.imshow("clahe_demo", dst)


def create_rgb_hist(image):#创建3通道rgb直方图
    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 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)
    match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)
    match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)
    print("巴氏距离: %s, 相关性: %s, 卡方: %s"%(match1, match2, match3))


print("--------HEllow Python-------")
src = cv.imread("E:/picture/05.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image",src)
#create_rgb_hist(src)

image1 = cv.imread("E:/picture/01.jpg")
image2 = cv.imread("E:/picture/02.jpg")
cv.imshow("image1", image1)
cv.imshow("image2", image2)
hist_compare(image1, image2)
cv.waitKey(0)


cv.destroyAllWindows()

http://www.niftyadmin.cn/n/3711220.html

相关文章

解决多线程代码

http://www.cnblogs.com/shanyou/archive/2008/10/25/1319283.html 解决多线程代码中的 11 个常见的问题 http://msdn.microsoft.com/zh-cn/magazine/cc817398.aspx 并行编程方面的设计注意事项 http://msdn.microsoft.com/zh-cn/magazine/cc872852.aspx 识别并发问题的工具和方…

Open CV系列学习笔记(十)直方图反向投影 2021-02-04

Open CV系列学习笔记(十)直方图反向投影 反向投影概念 反向投影是一种记录给定图像中的像素点如何适应直方图模型像素分布的方式,简单来讲,反向投影就是首先计算某一特征的直方图模型,然后使用模型去寻找图像中存在的…

51单片机用STC—ISP烧录程序是一直显示“正在检测目标单片机···”冷启动板子没有反应

1、遇到这种情况可能是板子和电脑的USB转串口接触不良,如果点STC—ISP也点不动的情况下,可以采取关掉STC—ISP在重新打开解决。如果嫌麻烦可以直接拔掉板子上的USB接口才重新插一下。 2、如果以上方法无法解决,则可能是因为跳线帽接的不对劲&…

win命令大全(个人认识只是部分而已)

Windows系统:开始--运行--命令大全 Nslookup-------IP地址侦测器 explorer-------打开资源管理器 logoff---------注销命令 tsshutdn-------60秒倒计时关机命令 lusrmgr.msc----本机用户和组 services.msc---本地服务设置 oobe/msoobe /a----检查XP是否激活 notepad--------打开…

Open CV系列学习笔记(十一)模板匹配 2021-02-05

Open CV系列学习笔记(十一)模板匹配 模板匹配 模板匹配就是在整个图像区域发现与给定子图像匹 配的小块区域。  所以模板匹配首先需要一个模板图像T(给定的子 图像)  另外需要一个待检测的图像-源图像S  工作方法&#xff…

Open CV系列学习笔记(十二)图像二值化 2021-02-06

Open CV系列学习笔记(十二)图像二值化 图像二值化 图像二值化( Image Binarization)就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果的过程。 在数字图像处理中,二值图像…

动态链接库的隐式连接与显式连接有什么不同

隐式链接是指在代码中使用了了库中的代码,只是在链接时,链接器会把该库的符号信息以及导入函数的信息写入到生成的Exe文件的特定的区段中。当该程序加载时,操作系统会根据这个区段中的信息,来查找每个它需要的动态库,并…

51单片机中的EEPROM怎么用?

EEPROM (Electrically Erasable Programmable read only memory)是指带电可擦可编程只读存储器。是一种掉电后数据不丢失的存储芯片。 EEPROM 可以在电脑上或专用设备上擦除已有信息,重新编程。一般用在即插即用。 EEPROM模块在“蓝桥杯”单片机设计与开发项目比赛…