java反向映射_opencv 直方图和直方图反向映射

histogram

使用np进行直方图像素统计

20180825140916_569.jpg

20180825140916_699.jpg

通过histogram对图像的三个通道分别进行一维直方图统计,由于被统计的数组必须是一维的,所以使用ravel将二维数组转换为一维数组,通过range参数指定统计区间为0--256,bin参数指定将统计区间分为256等分,histogram返回两个数组hist和x,hist为统计结果,长度为bin,而x是统计区间,长度为bin+1,hist[i]的值为数组中满足x[i]<=v

用histogram2d对通道0和通道2进行二维直方图统计,被统计的数组是两个一维数组,因此也需要使用ravel处理,他们分别是图像通道0和通道2的数据,bins和ranges参数都变成了有两个元素的序列,分别与两个数组相对应,返回的统计结果hist2是一个二维数组,其形状由bins决定,第0轴与第一个数组相对应,第1轴与第二个数组相对应,它是由两个一维数组的对应元素所构成的二维矢量的分布统计结果。

统计结果中亮度比较大的 地方表示图像中红色值在150--200和蓝色值在50-100附近的像素比较多

import cv2 as cv

import pylab as pl

import numpy as np

img = cv.imread('lena.jpg')

fig, ax = pl.subplots(1, 2, figsize=(12, 5))

colors = ['blue', 'green', 'red']

for i in range(3):

hist, x = np.histogram(img[:, :, i].ravel(), bins=256, range=(0, 256))

ax[0].plot(0.5 * (x[:-1] + x[1:]), hist, label=colors[i], color=colors[i])

ax[0].legend(loc='upper left')

ax[0].set_xlim(0, 256)

hist2, x2, y2 = np.histogram2d(

img[:, :, 0].ravel(),

img[:, :, 2].ravel(),

bins=(100, 100),

range=[(0, 256), (0, 256)]

)

ax[1].imshow(hist2, extent=(0, 256, 0, 256), origin=('lower'), cmap='gray')

ax[1].set_ylabel('blue')

ax[1].set_xlabel('red')

pl.show()

calcHist

opencv自带的直方图统计函数为calcHist,支持对多副图像进行N维直方图统计,因此第一个参数是图像列表,对img的三个通道(0,1,2)进行三维直方图统计,每个通道的等分数为(30,20,10),所有通道的取值范围都为(0,256),返回结果是一个形状为(30,20,10)的数组

import cv2 as cv

import pylab as pl

import numpy as np

img = cv.imread('lena.jpg')

result = cv.calcHist(

[img],

channels=(0, 1, 2),

mask=None,

histSize=(30, 20, 10),

ranges=(0, 256, 0, 256, 0, 256),

)

# (30, 20, 10)

print(result.shape)

直方图反向映射

计算出直方图后,可以使用calcBackProject将图像中的每个点替换为他在直方图中所对应的值,于是在直方图中出现次数越高,图像中对应的像素就越亮,可以使用这种方法找出图像中和直方图相匹配的区域

20180825140916_383.jpg

20180825140916_798.jpg

在图像中截取需要匹配的部分,计算待匹配部分的直方图,然后应用到目标图片中

局部阈值二值化效果

20180825140916_696.jpg

20180825140916_833.jpg

20180825140917_832.jpg

首先载入图片,转为hsv色系即色相,饱和度,和明度,相对模板图像的色相和饱和度进行二维直方图计算,在色相和饱和度空间进行颜色匹配能够得到比较好的匹配结果,为了后序计算像素值不溢出,进行归一化到0--255范围内

载入目标图像,转到hsv色系,将模板的统计结果匹配到目标图像

二值化处理,可以自己设置阈值,可以使用自适应二值化

形态学处理,开闭和鹏展腐蚀操作,为了更好的找到目标区域,消除杂点

这种方法适用于在视频中跟踪一个颜色鲜明的物体,在跟踪物体之前首先对一幅物体充满整个画面的图像进行直方图统计,然后对视频的帧进行calcBackProject计算

import cv2 as cv

import numpy as np

img = cv.imread('selection2.jpg')

img_hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)

cv.imshow('img', img)

cv.imshow('hsv', img_hsv)

result = cv.calcHist(

[img_hsv],

[0, 1],

None,

[40, 40],

[0, 256, 0, 256]

)

result /= np.max(result) / 255

# img2 = cv.imread('orange.jpg')

img2 = cv.imread('fruits.jpg')

cv.imshow('orange', img2)

img_hsv2 = cv.cvtColor(img2, cv.COLOR_BGR2HSV)

cv.imshow('orange hsv', img_hsv2)

img_bp = cv.calcBackProject(

[img_hsv2],

channels=[0, 1],

hist=result,

ranges=[0, 256, 0, 256],

scale=1,

)

# 自定义二值化

# _, img_th = cv.threshold(img_bp, 128, 255, cv.THRESH_BINARY_INV)

# 局部二值化,自适应阈值

# ADAPTIVE_THRESH_GAUSSIAN_C ADAPTIVE_THRESH_MEAN_C

# blockSize 必须为奇数

img_th = cv.adaptiveThreshold(img_bp, 255, cv.ADAPTIVE_THRESH_GAUSSIAN_C, cv.THRESH_BINARY, 25, 10)

cv.imshow('th', img_th)

# 核的大小和形状

kernel = cv.getStructuringElement(cv.MORPH_RECT, (5, 5))

# 开操作

img_mp = cv.morphologyEx(img_th, cv.MORPH_OPEN, kernel, iterations=5)

cv.imshow('mp', img_mp)

cv.waitKey(0)

转载至链接:https://my.oschina.net/ahaoboy/blog/1933912

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/338868.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

hamcrest_重新设计Hamcrest

hamcrest我在Hamcrest库上做了几篇文章 &#xff0c;我确实很喜欢使用它&#xff0c;但是我希望对其进行一些更改。 我了解他们所做的大多数设计决策&#xff0c;但我认为其中一些确实不值得。 介绍Litecrest 我对库所做的大多数更改都有助于减轻Hamcrest的负担&#xff0c;因…

程序员鄙视链python_关于程序员之间的鄙视链

鄙视像条食物链&#xff0c;是个绕不开的怪圈。在这个怪圈中&#xff0c;每一个人&#xff0c;都在链条的最末端。朋友圈有鄙视链&#xff0c;相亲有鄙视链&#xff0c;程序员圈也有鄙视链看完下面的鄙视链&#xff0c;你是那一层&#xff1f;↓↓↓↓【1】努力成为全栈&#x…

java自定义jsp标签_自定义JSP标签

1 写一个标签处理类//标签处理类public class IpTag implements SimpleTag {private PageContext pageContext;//Web容器调用NO1public void setJspContext(JspContext pc) {System.out.println("setJspContext()");pageContext (PageContext) pc;}//Web容器调用NO2…

新手学习C语言编程的8个致命错误,你中招了吗?

序言C语言的最大特点是&#xff1a;功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格&#xff0c;这就给编程人员留下“灵活的余地”。但由于这个灵活给程序的调试带来了许多不便&#xff0c;尤其对初学C语言的人来说&#xff0c;经常会出一些连自己都不…

java与java ee_Java EE拦截器

java与java ee历史 我认为重要的是要看一下Java EE中Interceptor的发展&#xff0c;因为它是从EJB特定的项目开始的&#xff0c;后来又演变成一个单独的规范&#xff0c;现在可供其他Java EE规范扩展&#xff0c;这一事实很简单。 版本1.0 拦截器最初是在EJB 3.0 &#xff08;…

python怎么查询元素是否在列表中_python怎么判断某一元素是否在列表中

定义一个列表&#xff0c;并判断元素是否在列表中。python学习网&#xff0c;大量的免费python基础教程&#xff0c;欢迎在线学习&#xff01;例如&#xff1a;test_list [ 1, 6, 3, 5, 3, 4 ]print("查看 4 是否在列表中 ( 使用循环 ) : ")for i in test_list:if(i…

python中带附件发送电子邮件_python发送带附件邮件

Python SMTP发送邮件SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议,它是一组用于由源地址到目的地址传送邮件的规则&#xff0c;由它来控制信件的中转方式。python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。Python创建 SMTP 对象…

jpa 实体图查询_JPA实体图

jpa 实体图查询JPA 2.1的最新功能之一是可以使用实体图指定获取计划。 这很有用&#xff0c;因为它允许您自定义使用查询或查找操作检索的数据。 在使用中大型应用程序时&#xff0c;通常以不同的方式显示来自同一实体的数据。 在其他情况下&#xff0c;您只想选择最小的信息集…

C语言程序控制语句——while

while语句while &#xff08;表达式&#xff09; 语句当表达式为非0值&#xff08;真&#xff09;时&#xff0c;执行while循环体中的语句&#xff0c;如此往复&#xff0c;直到表达式的值等于0&#xff08;假&#xff09;&#xff0c;循环结束。如以下示例程序&#xff0c;循环…

kettle 资料_Kettle的使用-初级

本文从kettle的简介、下载、安装、初级使用来展开。1.kettle是什么&#xff1f;kettle是一款开源的ETL工具。可以运行在Windows和linux上。2.下载地址https://community.hitachivantara.com/s/article/downloads3.安装因为Kettle是基于Java开发的&#xff0c;所以要先安装jdk环…

python抢货程序_写个Python程序上下班抢个顺风单

#!/usr/bin/python# -*- coding: gb2312 -*-##########################################################################2015-12-11 09:47:46#author: 358275018qq.com#使用Python2.6/7######################################################################### 有些库没…

C语言 | 语句概述

C语言语句的作用和分类1、9种控制语句if&#xff08;&#xff09;...else.. //条件语句 for&#xff08;&#xff09;... //循环语句 while&#xff08;&#xff09;... //循环语句 do...while&#xff08;&#xff09; //循环语句 continue //结束本次循环语句 break //中止执…

react性能优化方案_React灵敏且性能卓越的Spray + Akka解决方案,以“在Java和Node.js中发挥并发性和性能”...

react性能优化方案在我以前的文章中&#xff0c;我研究了一个虚拟的交易引擎&#xff0c;并将基于Java的阻止解决方案与基于Node.js的非阻止解决方案进行了比较。 在文章的结尾&#xff0c;我写道&#xff1a; 我怀疑随着Node.js的最近成功&#xff0c;越来越多的异步Java库将…

linux 查看日志_干货 | 名企高频考点之谈谈Linux日志查看方式都有哪些

点击蓝字关注我哦以下是本期干货视频视频后还附有文字版本哦▼《名企高频考点-谈谈Linux日志查看方式都有哪些》▼ps&#xff1a;请在WiFi环境下打开&#xff0c;如果有钱任性请随意0.概述在我们面试各大公司的时候&#xff0c;关于Linux往往最容易问到的问题之一就是Linux指令…

vsm java_java – 我尝试使用JAXB将对象编组到xml文件中时,错误为“缺少@XmlRootElement注释”...

我是刚刚开始使用JAXB的人,所有我需要的是将对象写入xml并在某些时候将其读回java这是我的班级&#xff1a;public class VSM implements java.io.Externalizable{ArrayList termList; //Term DictionaryArrayList queryTermList; //Query listArrayList> docLists;ArrayLis…

jvm7 jvm8_自我修复的JVM

jvm7 jvm8这篇帖子是关于一个应用程序的示例&#xff0c;其中解决每个IT问题的第一个解决方案-“您是否尝试过将其关闭并重新打开”-可能适得其反&#xff0c;弊大于利。 我们不需要关闭电源&#xff0c;而是拥有可以自愈的应用程序&#xff1a;它在一开始就失败了&#xff0c…

实例讲解C语言的位运算

C语言位运算有6种&#xff1a; &&#xff0c; | , ^(异或)&#xff0c; <<(左移)&#xff0c;>>(右移)。注意&#xff1a;参与位运算的元素必须是int型或者char型&#xff0c;以补码形式出现。1.按位与&&运算常应用于&#xff1a;迅速清零保留指定位判…

python3解释器执行not 1 and 1_编程语言的分类,python解释器多版本共存.执行python的两种方式,变量,用户与程序交互...

一、编程语言的分类&#xff1f;机器语言&#xff1a;直接使用二进制指令编程&#xff0c;直接操作硬件&#xff0c;必须考虑硬件细节。汇编语言&#xff1a;用简写的英文标识符取代二进制去编写程序&#xff0c;直接操作硬件&#xff0c;必须考虑硬件细节。高级语言&#xff1…

java字节码执行原理_《Java 底层原理》Java 字节码详解

前言我们在开发中会遇到一些Java的执行超出我们的想象&#xff0c;但是又不知道他为什么会这样执行&#xff0c;这个时候我们就需要能够知道他编译后Class文件是什么样子的&#xff0c;并且理解字节码的含义。Java字节码的原理进制class文件就是字节码文件&#xff0c;直接是打…

C语言学习笔记--位运算

这一节主要说的是位运算&#xff0c;计算机中的执行速度&#xff1a;位运算 > 加减 > 乘除 > 求余位运算就是将数字转换成二进制后进行运算&#xff0c;之后再将数字转换成原来的进制与运算&#xff1a;当两个数相与时&#xff0c;只有都为l的时候结果才为1&#xff0…