python-opencv中的cv2.inRange函数用法说明

本次目标是将一副图像从rgb颜色空间转换到hsv颜色空间,颜色去除白色背景部分

具体就调用了cv2的两个函数,一个是rgb转hsv的函数

具体用法

hsv = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)

然后利用cv2.inRange函数设阈值,去除背景部分

mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0,

函数很简单,参数有三个

第一个参数:hsv指的是原图

第二个参数:lower_red指的是图像中低于这个lower_red的值,图像值变为0

第三个参数:upper_red指的是图像中高于这个upper_red的值,图像值变为0

而在lower_red~upper_red之间的值变成255

lower_red = np.array([20, 20, 20])
upper_red = np.array([200, 200, 200])
mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0,lower~upper==>255

就是将低于lower_red和高于upper_red的部分分别变成0,lower_red~upper_red之间的值变成255

具体用法如下

 hsv = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV)
 lower_red = np.array([20, 20, 20])
 upper_red = np.array([200, 200, 200])
 # mask -> 1 channel
 mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0

补充:色彩阀值化处理——openCV-python中inRange()等相关函数实测

色彩阀值化

在图像处理的过程中,使用各种形态学操作或者滤波的方式来突显我们关注的元素,同时降低噪声并减少干扰我们提取关键元素的影响项。除了这些方法外,我们可以在原图中先依据颜色的特征,提取出更为关键的像素。就像车道检测时,一般车道只有两种颜色:黄色和白色。所以我们可以在 RGB 色彩空间(Color Space) 对这两种颜色进行过滤从而提取出车道线的像素。

色彩空间:使用一组值(通常使用三个、四个值或者颜色成分)表示颜色方法的抽象数学模型。有利用原色相混的比例表示的色彩空间,如 RGB (Red, Green, Blue) 颜色空间; 也有利用不同的概念表示的色彩空间,如 HSV (色相 hue, 饱和度 saturation, 明度 value) 以及 HSL (色相 hue,饱和度 saturation,亮度 lightness/luminance) 。

在OpenCV中,RGB三通道的图像的读取 cv2.imread() 的结果是以 BGR 顺序排列的,而在使用matplotlib的 plt.imread() 时, 读取的通道排列顺序则为 RGB 。因此此处应当注意区别。

openCV中cv2.inRange()函数是实现该功能的关键,我们先看看官网对该函数的定义:

dst = cv.inRange( src, lowerb, upperb[, dst] )

检测数组元素是否位于其他两个元素之间。

该函数检测范围方式如下:

对于单通道输入的每个元素:

对于双通道输入:

同样应用于四通道

也就是说,如果src (I)在指定的1D, 2D, 3D,…框内则dst(I)为255,否则为0。当下边界和/或上边界参数为标量时,应省略上述公式中在上、下边界处的索引(I)。

各参数详细含义:

src 输入的数组

lowerb 下边界数组或标量.

upperb 上边界数组或标量.

dst 与src和CV_8U类型大小相同的输出数组。

接下来将结合简单的例子通过python更好地理解这个函数:

import matplotlib.pyplot as plt
import numpy as np
import cv2
# 对图片进行读取
img_cv2 = cv2.imread('D:\\test\\CVtest.jpg')
print(img_cv2)

为了方便理解,我用画板工具画了一个5×5像素点的红色图片。上述代码运行结果为:

[[[ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]]
 [[ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]]
 [[ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]]
 [[ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]]
 [[ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]
  [ 36  27 237]]]

读者可以自行测试一下,B=36,G=27,R=237为红色。

# 创建RGB色彩空间
color_Low1 = np.array([30,27,237])
color_Low2 = np.array([39,27,237])
color_High = np.array([40,27,237])
# 对图片进行阀值化处理
img_dst1 = cv2.inRange(img_cv2,color_Low1,color_High)
img_dst2 = cv2.inRange(img_cv2,color_Low2,color_High)
#对结果进行打印
print(img_dst1,'\n', img_dst2)
# 运行结果分别为
[[255 255 255 255 255]
 [255 255 255 255 255]
 [255 255 255 255 255]
 [255 255 255 255 255]
 [255 255 255 255 255]]
 [[0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]
 [0 0 0 0 0]]

可以看出,当图片中的像素点落在色彩空间时,输出结果全是255,当像素点不落在色彩空间是,输出结果全是0。对最终结果进行显示:

#对图像进行展示
cv2.imshow("origin_img",img_cv2)
cv2.imshow("dst_img1",img_dst1)
cv2.imshow("dst_img2",img_dst2)
cv2.waitKey(0)
cv2.destroyAllWindows()

最终结果为一个红色、一个黑色的、一个白色的小点。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。如有错误或未考虑完全的地方,望不吝赐教。

(0)

相关推荐

  • 使用python和opencv的mask实现抠图叠加

    背景照片: logo: 合成效果: 代码: import cv2 as cv, numpy as np # Load two images img1 = cv.imread('227351.jpg') # 背景 img2 = cv.imread('logo.png') # logo # I want to put logo on top-left corner, So I create a ROI rows,cols,channels = img2.shape roi = img1[0:rows

  • python读取并显示图片的三种方法(opencv、matplotlib、PIL库)

    前言 在进行图像处理时,经常会用到读取图片并显示出来这样的操作,所以本文总结了python中读取并显示图片的3种方式,分别基于opencv.matplotlib.PIL库实现,并给出了示例代码,介绍如下. OpenCV OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux.Windows.Android和Mac OS操作系统上. 它轻量级而且高效--由一系列 C 函数和少量 C++ 类构成,同时提供了Python.Ruby.MATLAB等语言的接口

  • Python opencv缺陷检测的实现及问题解决

    题目描述 利用opencv或其他工具编写程序实现缺陷检测. 实现过程 # -*- coding: utf-8 -*- ''' 作者 : 丁毅 开发时间 : 2021/4/21 15:30 ''' import cv2 import numpy as np from PIL import Image, ImageDraw, ImageFont import matplotlib.pyplot as plt #用于给图片添加中文字符的函数 def cv2ImgAddText(img, text, l

  • python opencv常用图形绘制方法(线段、矩形、圆形、椭圆、文本)

    最近学了下 python opencv,分享下使用 opencv 在图片上绘制常用图形的方法. 案例中实现了在图片中添加线段.圆形.矩形.椭圆形以及添加文字的方法,使用 opencv2 实现的. 实现方法 1)画线段 cv.line 在图片中绘制一段直线 # 绘制线段 # 参数1:图片 # 参数2:起点 # 参数3:终点 # 参数4:BGR颜色 # 参数5:宽度 cv2.line(img, (60, 40), (90, 90), (255, 255, 255), 2); 参数说明 参数 值 说明

  • Python OpenCV快速入门教程

    OpenCV OpenCV是计算机视觉中最受欢迎的库,最初由intel使用C和C ++进行开发的,现在也可以在python中使用.该库是一个跨平台的开源库,是免费使用的.OpenCV库是一个高度优化的库,主要关注实时应用程序. OpenCV库是2500多种优化算法的组合,可用于检测和识别不同的人脸,实时识别图像中的对象,使用视频和网络摄像头对不同的人类动作进行分类,跟踪摄像机的运动,跟踪运动对象(例如汽车,人等),实时计数对象,缝合图像来产生高分辨率图像,从图像数据库中查找相似的图像,从使用闪光

  • python基于OpenCV模板匹配识别图片中的数字

    前言 本博客主要实现利用OpenCV的模板匹配识别图像中的数字,然后把识别出来的数字输出到txt文件中,如果识别失败则输出"读取失败". 操作环境: OpenCV - 4.1.0 Python 3.8.1 程序目标 单个数字模板:(这些单个模板是我自己直接从图片上截取下来的) 要处理的图片: 终端输出: 文本输出: 思路讲解 代码讲解 首先定义两个会用到的函数 第一个是显示图片的函数,这样的话在显示图片的时候就比较方便了 def cv_show(name, img): cv2.imsh

  • python OpenCV学习笔记

    图像翻转 使用Python的一个包,imutils.使用下面的指令可以安装. pip install imutils imutils包的Github地址:https://github.com/jrosebr1/imutils CSDN镜像:https://codechina.csdn.net/mirrors/jrosebr1/imutils 可以在上面这个地址里面学习更多的使用方式. import cv2 import imutils ''' imutils.rotate 第一个参数是翻转的图像

  • python-opencv中的cv2.inRange函数用法说明

    本次目标是将一副图像从rgb颜色空间转换到hsv颜色空间,颜色去除白色背景部分 具体就调用了cv2的两个函数,一个是rgb转hsv的函数 具体用法 hsv = cv2.cvtColor(rgb_image, cv2.COLOR_BGR2HSV) 然后利用cv2.inRange函数设阈值,去除背景部分 mask = cv2.inRange(hsv, lower_red, upper_red) #lower20===>0,upper200==>0, 函数很简单,参数有三个 第一个参数:hsv指的是

  • Opencv中的cv2.calcHist()函数的作用及返回值说明

    目录 cv2.calcHist()函数 cv2.calcHist()函数的作用 cv2.calcHist()函数的返回值 在讨论其返回值前,我们先来介绍以下calcHist()函数的用法: cv2.calcHist()函数 cv2.calcHist()函数的作用 通过直方图可以很好的对整幅图像的灰度分布有一个整体的了解,直方图的x轴是灰度值(0~255),y轴是图片中具有同一个灰度值的点的数目. 而calcHist()函数则可以帮助我们统计一幅图像的直方图 cv2.calcHist(images

  • Python中threading模块join函数用法实例分析

    本文实例讲述了Python中threading模块join函数用法.分享给大家供大家参考.具体分析如下: join的作用是众所周知的,阻塞进程直到线程执行完毕.通用的做法是我们启动一批线程,最后join这些线程结束,例如: for i in range(10): t = ThreadTest(i) thread_arr.append(t) for i in range(10): thread_arr[i].start() for i in range(10): thread_arr[i].joi

  • python中str内置函数用法总结

    大家在使用python的过程中,应该在敲代码的时候经常遇到str内置函数,为了防止大家搞混,本文整理归纳了str内置函数.1字符串查找类:find.index:2.字符串判断类:islower.isalpha:3.内容判断类:tartswith.endswith:4.操作类函数:format.strip.join. 1.字符串查找类:find.index find和index均是查找字符串中是否包含一个子串: 二者的区别是index找不到字符串会报错,而find会返回-1: rfind.lfin

  • Python Pandas中loc和iloc函数的基本用法示例

    目录 1 loc和iloc的含义 2 用法 2.1 loc函数的用法 2.2 iloc函数的用法 补充:Pandas中loc和iloc函数实例 总结 1 loc和iloc的含义 loc表示location的意思:iloc中的loc意思相同,前面的i表示integer,所以它只接受整数作为参数. 2 用法 import pandas as pd import numpy as np # np.random.randn(5, 2)表示返回5x2的矩阵,index表示行的编号,columns表示列的编

  • 浅谈Python Opencv中gamma变换的使用详解

    伽马变换就是用来图像增强,其提升了暗部细节,简单来说就是通过非线性变换,让图像从暴光强度的线性响应变得更接近人眼感受的响应,即将漂白(相机曝光)或过暗(曝光不足)的图片,进行矫正. 伽马变换的基本形式如下: 大于1时,对图像的灰度分布直方图具有拉伸作用(使灰度向高灰度值延展),而小于1时,对图像的灰度分布直方图具有收缩作用(是使灰度向低灰度值方向靠拢). #分道计算每个通道的直方图 img0 = cv2.imread('12.jpg') hist_b = cv2.calcHist([img0],

  • Python-OpenCV中的cv2.inpaint()函数的使用

    目录 概念 库函数 实现 代码 概念 修复是图像插值.数字修复算法在图像插值,照片恢复,缩放和超分辨率等方面具有广泛的应用. 大多数人会在家里放一些旧的退化照片,上面有一些黑点,一些笔画等.你有没有想过恢复它?我们不能简单地在绘画工具中擦除它们,因为它将简单地用白色结构替换黑色结构,这是没有用的.在这些情况下,使用称为图像修复的技术.基本思路很简单:用邻近的像素替换那些坏标记,使其看起来像是邻居(取自维基百科),考虑下面显示的图像: 库函数 dst = cv2.inpaint(src,mask,

  • python opencv检测直线 cv2.HoughLinesP的实现

    cv2.HoughLines()函数是在二值图像中查找直线,cv2.HoughLinesP()函数可以查找直线段. cv2.HoughLinesP()函数原型: HoughLinesP(image, rho, theta, threshold, lines=None, minLineLength=None, maxLineGap=None) image: 必须是二值图像,推荐使用canny边缘检测的结果图像: rho: 线段以像素为单位的距离精度,double类型的,推荐用1.0 theta:

  • Python Opencv中获取卷积核的实现代码

    目录 1.cv2.getStructuringElement(shape,ksize,anchor=(-1,-1)) 2.函数讲解 3.代码实战 1.cv2.getStructuringElement(shape,ksize,anchor=(-1,-1)) 该函数构造并返回可进一步传递给createMorphologyFilter().Correase().Explate()或morphologyEx()的结构元素.但您也可以自己构造任意的二进制掩码,并将其用作结构元素. 2.函数讲解 getS

  • Python Opencv中基础的知识点

    目录 1.创建窗口 2.保存图片 3.采集视频 4.鼠标控制 5.TrackBar组件 OpenCV 是一个流行的开源计算机视觉库,可用于不同的编程语言,例如 Python.C++ 和 JavaScript.它提供了一套丰富的工具来处理和分析图像和视频,让你可以从调整单张图片的大小到构建复杂的对象识别应用程序. 本文给大家介绍Python Opencv中基础的知识点. 1.创建窗口 import cv2 import numpy as np def createWindow(): #读取图片 i

随机推荐