210_Python+OpenCV_06_图像直方图(histogram)HOG-全局/局部均衡化/直方图比较/反向投影_hog均衡化_linda.serious的博客-程序员宅基地

技术标签: 230_Semantic Segmentation  Z-归档_OpenCV  

一、python+OpenCV_06_图像直方图(histogram)HOG

0-255个像素值,每个值出现的频次是多少
在这里插入图片描述
256个bin意思就是有256个竖的条条,bin-size是64,意思是以64为bin宽度,统计频次

# -*- coding:utf-8 -*-
# Linda Li 2019/8/25 15:44 cv_28_图像直方图 PyCharm

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


def plot_demo(image):
    """
    image.ravel()统计频次的
    bins 256,256条直方
    range[0,256]
    """
    plt.hist(image.ravel(), 256, [0, 256])
    plt.show()


print("-------hello python--------")
src = cv.imread("../cv_02/cv_193.jpeg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

plot_demo(src)

cv.waitKey(0)
cv.destroyAllWindows()



在这里插入图片描述

二、直方图的API

在这里插入图片描述
在这里插入图片描述在这里插入图片描述整由于张图片比较偏白色,所以三个通道都在255左右取得波峰,把这些值抠出来,其实就可确定人的位置,背景和前景

# -*- coding:utf-8 -*-
# Linda Li 2019/8/25 15:44 cv_28_图像直方图 PyCharm

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


def plot_hist(image):
    """绘制三个通道的图像,这个是个第三方的API模板"""
    # 三个颜色 i = 0, 1, 2
    color = ('blue', 'green', 'red')

    # 绘制每一个颜色对应的直方图
    for i, color in enumerate(color):

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


print("-------hello python--------")
src = cv.imread("../cv_02/cv_291.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

plot_hist(src)

cv.waitKey(0)
cv.destroyAllWindows()

三、直方图均值化——增强对比度(全局)

在这里插入图片描述
在这里插入图片描述

# -*- coding:utf-8 -*-
# Linda Li 2019/8/25 17:37 cv_30_直方图均衡化 PyCharm

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


def equal_hist(image):
    """直方图均值化,是图像增强的一个手段"""

    # opencv中的直方图均衡化都是基于灰度图像的,所以要先将图像变成灰度图像
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)
    dst = cv.equalizeHist(gray)
    cv.imshow("equal_hist", dst)


print("-------hello python--------")
src = cv.imread("../cv_02/cv_30.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

equal_hist(src)

cv.waitKey(0)
cv.destroyAllWindows()

四、直方图均值化——增强对比度(局部)

在这里插入图片描述
全局的直方图均衡化有些失真

# -*- coding:utf-8 -*-
# Linda Li 2019/8/25 17:37 cv_30_局部直方图均衡化 PyCharm

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


def clahe_demo(image):
    """局部自适应的直方图均衡化"""

    # openCv中的直方图均衡化都是基于灰度图像的,所以要先将图像变成灰度图像
    gray = cv.cvtColor(image, cv.COLOR_BGR2GRAY)

    # clipLimit指的是差异的大小, 8 * 8 的区域
    clahe = cv.createCLAHE(clipLimit=5.0, tileGridSize=(8, 8))

    dst = clahe.apply(gray)
    cv.imshow("clahe_demo", dst)


print("-------hello python--------")
src = cv.imread("../cv_02/cv_30.png")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)

clahe_demo(src)

cv.waitKey(0)
cv.destroyAllWindows()

五、直方图的比较

在这里插入图片描述
解释

  1. 相关性 =1
  2. 卡方
  3. 相交性
  4. 巴氏距离
    == 两张图片如果相似度很高的话,2,3,4都应该很小==
    找相似的图片可以通过做出两张图片的两个直方图排除50%,剩下的可以考虑用比较高级的特征,比如纹理
    ,边缘,角度,梯度特征再比较

在这里插入图片描述
又测试了一张模糊放大的照片相似度如下

在这里插入图片描述
巴氏距离:0.060010098789997, 相关性: 0.9992416574913615, 卡方: 2503696.7459648685

# -*- coding:utf-8 -*-
# Linda Li 2019/8/25 17:37 cv_30_局部直方图均衡化 PyCharm

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


def create_rgb_hist(image):
    h, w, c = image.shape

    # 初始化1维度
    rgb_hist = np.zeros([16*16*16, 1], np.float32)

    # bins bin的数量 16
    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]

            # 把float转换为int之后才可以做index,每一个出现的是在哪个颜色里面,就给他加一
            index = np.int(b/bsize) * 16 * 16 + np.int(g/bsize) * 16 + np.int(r/bsize)

            # 本来都是0,加上1
            rgb_hist[np.int(index), 0] = rgb_hist[np.int(index), 0] + 1

    return rgb_hist


def hist_compare(image1, image2):
    hist1 = create_rgb_hist(image1)
    hist2 = create_rgb_hist(image2)

    # 1.巴氏距离
    match1 = cv.compareHist(hist1, hist2, cv.HISTCMP_BHATTACHARYYA)

    # 2.相关性
    match2 = cv.compareHist(hist1, hist2, cv.HISTCMP_CORREL)

    # 3.卡方-不太好度量,还是用1,2比较多
    match3 = cv.compareHist(hist1, hist2, cv.HISTCMP_CHISQR)

    print("巴氏距离:%s, 相关性: %s, 卡方: %s" % (match1, match2, match3))


print("-------hello python--------")
image1 = cv.imread("../cv_02/cv_193.jpeg")
image2 = cv.imread("../cv_02/cv_181.jpg")
image3 = cv.imread("../cv_02/cv_24r1.png")
cv.imshow("image1", image1)
cv.imshow("image2", image2)
cv.imshow("image3", image3)
# hist_compare(image1, image2)
hist_compare(image1, image3)


cv.waitKey(0)
cv.destroyAllWindows()

六、直方图反向投影

在这里插入图片描述
在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44304362/article/details/99888175

智能推荐

c语言取整方法和四舍五入和 %d 和 %04d 和%-4d有什么区别_%04d:_九阈的博客-程序员宅基地

c语言取整方法(1)使用int强制转换使用int强制转换的结果就是去掉小数部分。int a;a=int(1.2); //a=1a=int(-1.2); //a=-1(2)使用floor函数向下取整使用floor函数的结果是向下取整,即得到比该数小的最大整数,需要包含头文件math.hin a;a=floor(1.2); //a=1a=floor(-1.2); //a=-2(3)使用ceil函数向上取整使用ceil函数的结果是向上取整,即得到比该数大的最小整数,需要包含头文件ma_%04d:

python播放视频判断是否暂停_Javascript判断Video视频播放、暂停、结束完成及获取长度事件监听处理...-程序员宅基地

在日常应用场景中,可能会遇到这么一个情况,需要判断用户是否完整的观看完了一部视频,在这个场景中,和视频相关的事件大体涉及到几个部分,获取视频长度,视频开始播放,暂停播放和播放结束,下面来看下如何通过JavaScript来监听获取视频的这几种状态。html页面视频标签大体如下:视频加载后获取视频的长度:varelevideo=document.getElementById("video");e..._python 检查视频是否播放

Docker 错误之 IPv4 forwarding is disabled. Networking will not work_giobaforwarding[/etc/susconfrestartnetworkiq/netwo-程序员宅基地

今天使用Docker在启动RabbitMQ时发现出错了,整理了一下解决方案出错原因没有开启转发,网桥配置完后,需要开启转发,不然容器启动后,就会没有网络解决步骤执行指令vim /etc/sysctl.conf配置转发 net.ipv4.ip_forward=1重启服务,配置生效 systemctl restart network执行指令 sysctl net.ipv4.ip_forward如果返回“net.ipv4.ip_forward = 1”则表示成功_giobaforwarding[/etc/susconfrestartnetworkiq/networlleas disabled inconfiqur

程序员学习源码的正确方式(spring框架为例)_spring框架学习方式-程序员宅基地

程序员学习源码的正确方式首先,登录全球最大的同性交流网站 GitHub :https://github.com/输入框输入:spring framework可以看到,spring的全家桶已经start接近100k了spring框架的源码都在这里了,这里可以克隆或者下载..._spring框架学习方式

三个按钮作业-程序员宅基地

一、Click事件的用法<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>click事件</title></head><body><form action="...

今天考试总结-程序员宅基地

长时间没有练习,考试中间代码打的太慢,一些都想不起来了,浪费很多时间,导致后面选择题没有时间认真看题,随便就把答案写了课后要多看看题,多练习练习,避免下次出现同样的错误。毕竟孰能生巧..._今天考试

随便推点

VMware EXSI 为虚拟机centos安装VMware Tools-程序员宅基地

VMware EXSI 为虚拟机centos安装VM ware Tools1.首先查看虚拟机是否安装VMware Tools2.打开虚拟机控制台3.选择虚拟机——客户机——安装/升级VMware tools4.建立一个挂载点挂载并拷贝解压5.进入vmware-tools-distrib目录执行 ./vmware-install.pl 开始安装 因为该centos是最小化安装,会报一个错误可以

在linux系统下ping不通windows主机问题-程序员宅基地

问题描述:采用ftp远程传输文件,出现问题,且ping不通windows主机解决办法:关闭Windows防火墙具体步骤:打开控制面板–系统和安全–Windows 防火墙–在左边一栏选择"打开或关闭Windows防火墙"–选择"关闭Windows防火墙"再ping主机ip,成功...

给你的文件加密,除了你谁也打不开- VeraCrypt-程序员宅基地

平时我们把数据放在那儿,网盘?U盘?还是在硬盘睡觉。如果不想别人看到怎么办?简单的方法就是放在别人找不到的地方,复杂点的方法就是把数据加密,即使别人找到了,没密码也没办法查看。那么数据怎样加密才安全?如果你面对的是一群小白的话,改个文件名、后缀名基本就完事,如果你面对的是比较懂得人,显然需要一种安全的加密手段。有个很用的加密工具-VeraCrypt,平时小电影一些隐私文件有地儿存放。...

Linux正则表达式-选择性操作与分组操作_awk 正则 分组-程序员宅基地

选择性操作竖线(|)字符是元字符扩展集的一部分,用于指定正则表达式的联合。如果某行匹配其中的一个正则表达式,那么它就匹配该模式。例如,正则表达式:UNIX|LINUX将匹配包含字符串"UNIX" 或字符串"LINUX" 的行。可以指定更多的选择,例如:UNIX|LINUX|NETBSD使用egrep时,打印匹配这3种模式中任意一种的行。在sed中,没有联合元字符,可以分别指_awk 正则 分组

linux查看某个pid的所有进程-程序员宅基地

top -H -p $PID #查看对应进程的那个线程占用CPU过高1、top -H手册中说:-H : Threads toggle加上这个选项启动top,top一行显示一个线程。否则,它一行显示一个进程。2、ps xH手册中说:H Show threads as if they were processes这样可以查看所有存在的线程。3、ps -mp手册中说:m Show th...

POJ 2891-trange Way to Express Integers(解线性同余方程组)-程序员宅基地

Strange Way to Express IntegersTime Limit: 1000MS Memory Limit: 131072KTotal Submissions: 13819 Accepted: 4451DescriptionElina is reading a book written by Ruji

推荐文章

热门文章

相关标签