IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> OpenCV直方图-反投影 -> 正文阅读

[人工智能]OpenCV直方图-反投影

反投影用于图像分割或在图像中查找感兴趣的对象。

1.利用Numpy实现

  • 首先,需要计算要查找的对象(使其为“ M”)和要搜索的图像(使其为“ I”)的颜色直方图
  • 求出比值R = M/I。然后反向投影R,即使用R作为调色板,并以每个像素作为其对应的目标概率创建一个新图像。即B(x,y) = R[h(x,y),s(x,y)。其中h是色调,s是像素在(x,y)的 饱和度。之后,应用条件B(x,y) =min[B(x,y), 1]
  • 对B应用卷积,内核使用圆盘内核
  • 现在最大强度的位置给了我们物体的位置。如果期望图像中有一个区域,则对合适的值进行阈值处理将获得不错的结果

代码示例:

import numpy as np
import cv2 as cv
#roi是我们需要找到的对象或对象区域
roi = cv.imread('C:\\Users\\dell\\Desktop\\prac files\\roi.jpg')
hsv = cv.cvtColor(roi,cv.COLOR_BGR2HSV) #目标是我们搜索的图像
target = cv.imread('C:\\Users\\dell\\Desktop\\prac files\\prac14.jpg')
hsvt = cv.cvtColor(target,cv.COLOR_BGR2HSV)
# 使用calcHist查找直方图。也可以使用np.histogram2d完成
M = cv.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )
I = cv.calcHist([hsvt],[0, 1], None, [180, 256], [0, 180, 0, 256] )
np.seterr(divide='ignore',invalid='ignore')
R = M/I
h,s,v = cv.split(hsvt)
B = R[h.ravel(),s.ravel()]
B = np.minimum(B,1)
B = B.reshape(hsvt.shape[:2])
disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
cv.filter2D(B,-1,disc,B)
B = np.uint8(B)
cv.normalize(B,B,0,255,cv.NORM_MINMAX)
ret,thresh = cv.threshold(B,50,255,0)
thresh = cv.merge((thresh,thresh,thresh))
res = cv.bitwise_and(target,thresh)
cv.namedWindow("prac", 0)
cv.imshow("prac", res)
cv.waitKey(0)
cv.destroyAllWindows()

2.利用OpenCV实现

主要使用calcBackProject()函数来实现。

calcBackProject(images, nimages, channels, hist, backProject, ranges, scale = 1, uniform = true)

参数如下:

  • images:输入的图像(或图像集),它们需为相同深度(CV_8U 或 CV_32F)和相同尺寸,而通道数任意。
  • nimages:输入图像个数。
  • channels:需要统计图像的通道索引即第几个通道,第一幅图的通道索引可选范围 [0, images[0].channels() -1],第二幅图的通道索引可选范围 [images[0].channels(), images[0].channels() + images[1].channels() - 1] 。以此类推。
  • hist:输入的直方图。
  • backProject:反向投影图像,需为单通道,并且和 images[0] 有相同的大小和深度。
  • ranges:直方图中 x 轴的取值范围。
  • scale:缩放因子,backProject [i][j] = scale * hist [images[k] [i][j]],有默认值1。
  • uniform:直方图是否均匀化的标识符,有默认值 true。

计算步骤:

  • 首先找到物体的直方图
  • 然后对直方图进行归一化,再传递给backproject函数,最后函数返回概率图像
  • 然后用圆盘内核对图像进行卷积并应用阈值。

代码示例:

import numpy as np
import cv2 as cv
roi = cv.imread('C:\\Users\\dell\\Desktop\\prac files\\roi.jpg')
hsv = cv.cvtColor(roi,cv.COLOR_BGR2HSV)
target = cv.imread('C:\\Users\\dell\\Desktop\\prac files\\prac14.jpg')
hsvt = cv.cvtColor(target,cv.COLOR_BGR2HSV)
# 计算对象的直方图
roihist = cv.calcHist([hsv],[0, 1], None, [180, 256], [0, 180, 0, 256] )
# 直方图归一化并利用反传算法
cv.normalize(roihist,roihist,0,255,cv.NORM_MINMAX)
dst = cv.calcBackProject([hsvt],[0,1],roihist,[0,180,0,256],1)
# 用圆盘进行卷积
disc = cv.getStructuringElement(cv.MORPH_ELLIPSE,(5,5))
cv.filter2D(dst,-1,disc,dst)
# 应用阈值作与操作
ret,thresh = cv.threshold(dst,50,255,0)
thresh = cv.merge((thresh,thresh,thresh))
res = cv.bitwise_and(target,thresh)
res = np.vstack((target,thresh,res))
cv.namedWindow("prac", 0)
cv.imshow("prac", res)
cv.waitKey(0)
cv.destroyAllWindows()
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-31 15:27:21  更:2021-08-31 15:27:59 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/1 10:37:48-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码