GVKun编程网logo

在Python中使用OpenCV访问轮廓边界内的像素值(opencv python 轮廓检测)

13

在本文中,我们将为您详细介绍在Python中使用OpenCV访问轮廓边界内的像素值的相关知识,并且为您解答关于opencvpython轮廓检测的疑问,此外,我们还会提供一些关于android–Open

在本文中,我们将为您详细介绍在Python中使用OpenCV访问轮廓边界内的像素值的相关知识,并且为您解答关于opencv python 轮廓检测的疑问,此外,我们还会提供一些关于android – OpenCV获取轮廓边界内的黑色像素、c – OpenCV:规范化图像的像素值、opencv python 图像轮廓/检测轮廓/绘制轮廓、opencv python 读取/修改像素值/访问图像属性/ROI/拆分合并图像通道/绘制图像边框的有用信息。

本文目录一览:

在Python中使用OpenCV访问轮廓边界内的像素值(opencv python 轮廓检测)

在Python中使用OpenCV访问轮廓边界内的像素值(opencv python 轮廓检测)

我在Python 2.7.9上使用OpenCV
3.0.0。我正在尝试跟踪具有静止背景的视频中的对象,并估计其某些属性。由于一幅图像中可能有多个运动对象,因此我希望能够区分它们,并在视频的其余帧中分别跟踪它们。

我认为可以做到这一点的一种方法是,将图像转换为二进制图像,获取Blob(在这种情况下为跟踪对象)的轮廓,并获取对象边界的坐标。然后,我可以转到灰度图像中的这些边界坐标,获取该边界所包围的像素强度,并在其他帧中跟踪此颜色梯度/像素强度。这样,我可以使两个对象彼此分开,因此在下一帧中它们不会被视为新对象。

我有轮廓边界坐标,但是我不知道如何检索该边界内的像素强度。有人可以帮我吗?

谢谢!

android – OpenCV获取轮廓边界内的黑色像素

android – OpenCV获取轮廓边界内的黑色像素

我目前正在尝试检索轮廓边界内存在的所有黑色像素.我对轮廓边界不感兴趣,而是对位于边界内的黑色像素构成实际图像.如果我能得到图像的实际坐标,那将是很棒的.

我已经尝试使用掩码使用copyTo方法,但我相信我没有设置正确的参数.虽然,我也尝试使用Core.fillpoly,它只是用命令中指定的颜色填充整个轮廓区域,并且获取像素信息没有帮助.有人可以指导我吗?我正在使用OpenCV 2.3.1开发Android 2.2.

解决方法

有一组像素落在轮廓边界内.还有另一组黑色像素.您想要找到这两个集合的交集,即在边界内并且颜色为黑色的像素集合.

要做到这一点,我会:

>将轮廓绘制为填充形状,将白色绘制为黑色(在其自己的图像中),使其成为蒙版.
您可以使用cv :: drawContours或cv :: fillpoly.
>将图像中的黑色像素过滤为另一个蒙版.
您可以将cv :: threshold与THRESH_BINARY_INV一起使用,并将阈值设置为零.
>使用bitwise_and或简单地使用&来查找相交集.运算符如matResult = mat1& MAT2;

结果是与图像大小相同的矩阵,仅对于满足轮廓内的标准和图像中的黑色的像素具有非零值.您可以通过循环此矩阵并测试非零值来获取各个坐标.

c – OpenCV:规范化图像的像素值

c – OpenCV:规范化图像的像素值

我试图将图像的像素值标准化为具有0.0的平均值和1.0的范数,以使图像具有一致的强度.有一个OpenCV函数,即cvnormalize(src,dst,1,cv_MINMAX),但是这个函数可以用于我的目的吗?任何帮助表示赞赏.谢谢.

解决方法

不,documentation for normalize说:

当normType = norM_MINMAX(仅适用于密集数组)时,函数会对scale进行规范化并移动输入数组元素,以便:

equations http://docs.opencv.org/_images/math/31bceb122fccfc14279355379f91c7b269290386.png

因此,如果使用normalize(src,norM_MINMAX,CV_32F);,您的数据将被标准化,以使最小值为0,最大值为1.

通过给出图像的像素值0.0和1.0的范数,你不清楚你的意思.在您编写时,我了解您要对像素值进行标准化,以便通过堆叠图像列获得的向量的范数为1.0.如果这是您想要的,您可以使用meanStdDev(documentation)并执行以下操作(假设您的图像是灰度):

cv::Scalar avg,sdv;
cv::meanStdDev(image,avg,sdv);
sdv.val[0] = sqrt(image.cols*image.rows*sdv.val[0]*sdv.val[0]);
cv::Mat image_32f;
image.convertTo(image_32f,CV_32F,1/sdv.val[0],-avg.val[0]/sdv.val[0]);

如果您只想标准化以使像素值的方差为1,则忽略第3行.

是的,CV_32F意味着生成的图像将使用32位浮点数据类型(即浮点数).

opencv python 图像轮廓/检测轮廓/绘制轮廓

opencv python 图像轮廓/检测轮廓/绘制轮廓

Contours : Getting Started

轮廓

简单地解释为连接所有连续点(沿着边界)的曲线,具有相同的颜色或强度.
轮廓是形状分析和物体检测和识别的有用工具

NOTE

  • 为获得更好的准确性,请使用二值图,在找到轮廓之前,应用阈值法或canny边缘检测
  • 从OpenCV 3.2开始,findContours()不再修改源图像,而是将修改后的图像作为三个返回参数中的第一个返回
  • 在OpenCV中,查找轮廓是从黑色背景中查找白色对象

findContours(image, mode, method[, contours[, hierarchy[, offset]]])

  • image:原图像
  • mode:轮廓检索模式
  • method:轮廓近似方法

输出为: 修改后的图像,轮廓,层次结构
轮廓是所有轮廓的列表.每个单独的轮廓是对象边界点的坐标.

轮廓检索模式 含义
cv2.RETR_EXTERNAL 只检测外轮廓
cv2.RETR_LIST 提取所有轮廓并将其放入列表,不建立等级关系
cv2.RETR_CCOMP 建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层
cv2.RETR_TREE 建立一个等级树结构的轮廓
轮廓逼近方法 含义
cv2.CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1 或 cv2.CHAIN_APPROX_TC89_KCOS 应用Teh-Chin链近似算法

代码

import cv2
import numpy as np

img = cv2.imread(''img.jpg'')
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

绘制轮廓

cv2.drawContours(image, contours, contourIdx, color[, thickness[, lineType[, hierarchy[, maxLevel[, offset]]]]])

  • image:原图像
  • contours:作为Python列表传递的轮廓
  • contourIdx:轮廓索引(在绘制单个轮廓时很有用。绘制所有轮廓,传递-1)

•要绘制图像中的所有轮廓:
cv.drawContours(img,contours,-1,(0,255,0),3)

•要绘制单个轮廓,比如第4个轮廓:
cv.drawContours(img,contours,3,(0,255,0),3)

•但大多数情况下,绘制第4个轮廓,以下方法将非常有用:
cnt = contours[4]
cv.drawContours(img,[cnt],0,(0,255,0),3)

代码

import cv2
import numpy as np

img = cv2.imread(''img7.png'')
imgray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, thresh = cv2.threshold(imgray, 127, 255, 0)
im2, contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnt = contours[0]
cv2.drawContours(img,[cnt],0,(0,255,0),3)

cv2.imshow(''src'',img)

cv2.waitKey()

clipboard.png
clipboard.png

opencv python 读取/修改像素值/访问图像属性/ROI/拆分合并图像通道/绘制图像边框

opencv python 读取/修改像素值/访问图像属性/ROI/拆分合并图像通道/绘制图像边框

Basic Operations on Images

1读取和修改像素值

可以通过行列坐标访问像素值.对于BGR图,它返回一个蓝色、绿色、红色通道的数组值.对于灰度图,仅返回相应的强度值.

代码

import numpy as np
import cv2
img = cv2.imread(''img.jpg'')
px = img[32,32]#访问(32,32)坐标像素值
print(px)


[ 33 108  57]
print(img[32,32,0]) #访问B通道像素值

33
print(img[32,32,1]) #访问G通道像素值

108
img[32,32]=[108,108,108]#修改像素值
print(img[32,32])

[108 108 108]

Note

  • Numpy是一个用于快速阵列计算的优化库。 因此,简单地访问每个像素值并对其进行修改将非常缓慢
  • 上述方法通常用于选择数组的一个区域,比如前五行和三列.对于访问单个像素点,推荐使用array.item()array.itemset(),它们返回的是一个标量.如果需要访问所有B,G,R值,需要对它们单独调用array.item()

代码

img.item(32,32,2)#访问R值

108
img.itemset((32,32,2),100)#修改R值
img.item(32,32,2)

100

2访问图像属性

图像的属性包括行数,列数,通道数,图像数据类型,像素数等.
img.shape访问图像的形状,返回一组行,列,通道的元组(彩色图像)

print(img.shape)

(331, 480, 3)

NOTE:
注意如果图像是灰度图像,则返回的元组仅包含行数和列数,因此它是一种检查图像是灰度图像还是彩色图像的好方法.

img.size访问像素总数

print(img.size)

476640

img.dtype访问图像数据类型

print(img.dtype)

uint8

NOTE
img.dtype在调试时非常重要,因为OpenCV-Python代码中的大量错误是由无效的数据类型引起的。

3图像ROI

有时,您必须使用某些图像区域。 对于图像中的眼睛检测,在整个图像上进行第一次面部检测。 当获得面部时,我们单独选择面部区域并在其内部搜索眼睛而不是搜索整个图像。 它提高了准确性(因为眼睛总是在脸上:D)和表现(因为我们在一个小区域搜索)。

使用Numpy索引再次获得ROI。

应用

我选择感兴趣区域并将其复制到图像中的另一个区域:
代码

import cv2
img = cv2.imread(''img.jpg'')

husky = img[1:240,60:270]
img[61:300,270:480] = husky

cv2.imshow(''show'',img)
cv2.waitKey()

clipboard.png

4拆分和合并图像通道

有时需要在B,G,R通道图像上单独工作。 在这种情况下,您需要将BGR图像分割为单个通道。

b,g,r = cv2.split(img) #拆分图像通道
img = cv2.merge((b,g,r))

或者

b = img[:,:,0]

假设您要将所有R像素设置为零,则无需先拆分通道。 Numpy索引更快:

img[:,:,2] = 0

NOTE:
cv2.split()是一项代价高的操作(就时间而言)。 所以只有在你需要时才这样做。 否则去Numpy索引。

5绘制图像边框

cv2.copyMakeBorder(src, top, bottom, left, right, borderType[, dst[, value]])

  • src - 输入图像
  • top,bottom,left,right - 相应方向上像素数的边框宽度
  • value : cv2.BORDER_CONSTANT,cv2.BORDER_REFLECT,cv2.BORDER_REFLECT_101 or cv2.BORDER_DEFAULT ,cv2.BORDER_REPLICATE,cv2.BORDER_WRAP
cv2.BORDER_CONSTANT 添加常量彩色边框
cv2.BORDER_REFLECT Border将是边框元素的镜像反射

cv2.BORDER_REFLECT_101cv2.BORDER_DEFAULT - 与上面相同,但略有改动,如下所示:gfedcb | abcdefgh | gfedcba
cv.BORDER_REPLICATE - 最后一个像素在整个过程中被复制,像:aaaaaa |abcdefgh|hhhhhhh这样
cv.BORDER_WRAP - 对称方向 像素互换 就像: cdefgh|abcdefgh|abcdefg 这样

应用

import cv2
from matplotlib import pyplot as plt

BLUE = [255,0,0]

img1 = cv2.imread(''img1.jpg'')

replicate = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REPLICATE)
reflect = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_REFLECT_101)
wrap = cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_WRAP)
constant= cv2.copyMakeBorder(img1,10,10,10,10,cv2.BORDER_CONSTANT,value=BLUE)

plt.subplot(231),plt.imshow(img1,''gray''),plt.title(''ORIGINAL'')
plt.subplot(232),plt.imshow(replicate,''gray''),plt.title(''REPLICATE'')
plt.subplot(233),plt.imshow(reflect,''gray''),plt.title(''REFLECT'')
plt.subplot(234),plt.imshow(reflect101,''gray''),plt.title(''REFLECT_101'')
plt.subplot(235),plt.imshow(wrap,''gray''),plt.title(''WRAP'')
plt.subplot(236),plt.imshow(constant,''gray''),plt.title(''CONSTANT'')

plt.show()

clipboard.png

今天关于在Python中使用OpenCV访问轮廓边界内的像素值opencv python 轮廓检测的介绍到此结束,谢谢您的阅读,有关android – OpenCV获取轮廓边界内的黑色像素、c – OpenCV:规范化图像的像素值、opencv python 图像轮廓/检测轮廓/绘制轮廓、opencv python 读取/修改像素值/访问图像属性/ROI/拆分合并图像通道/绘制图像边框等更多相关知识的信息可以在本站进行查询。

本文标签: