使用opencv识别图像红色区域,并输出红色区域中心

使用OpenCV识别图像红色区域

如果你正在使用OpenCV进行图像分析和处理,有时候需要识别和分割图像中的某些特定颜色区域。在本文中,我们将探讨如何使用OpenCV在Python中识别图像中的红色区域,并输出红色区域的中心。我们将使用OpenCV中的HSV(色相饱和度)颜色空间来处理图像。

HSV颜色空间

HSV(色相饱和度)颜色空间将颜色表示为三个值:hue(色相),saturation(饱和度)和value(亮度)。HSV颜色空间比RGB颜色空间更加直观,因为在RGB空间中,颜色表示为三种红、绿、蓝(RGB)分量的混合,而在HSV空间中,则将颜色表示为人眼感知的颜色属性:色相、饱和度和亮度。

识别红色区域

红色的色相值的范围在HSV颜色空间中是从0-10和160-180。因此,我们可以使用这些值来识别图像中的红色区域。在本文中,我们将创建一个Python脚本,该脚本将读取一张图片并识别红色区域。接下来,我们将看一下如何处理图像。

首先,我们需要导入必要的库:

import numpy as np

import cv2

接下来,我们需要读取图像并将其转换为HSV颜色空间:

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

hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

下一步是定义我们要在图像中寻找的红色范围。我们需要准备两个数组,一个数组是红色的下限值,另一个数组是红色的上限值。

low_red = np.array([0,50,50])

high_red = np.array([10,255,255])

low_red2 = np.array([160,50,50])

high_red2 = np.array([180,255,255])

接下来,我们需要通过使用cv2.inRange()函数将红色范围内的像素的值设置为1,其余值设置为0,生成一个二进制掩码。我们将调用cv2.bitwise_or()函数将两个二进制掩码中的像素运算,以便我们可以同时处理两个红色色相范围内的颜色。

mask_red = cv2.inRange(hsv_img, low_red, high_red)

mask_red2 = cv2.inRange(hsv_img, low_red2, high_red2)

mask_red = cv2.bitwise_or(mask_red, mask_red2)

使用cv2.bitwise_and()函数和生成的二进制掩码,我们可以将原始图像与掩码相乘,从而得到只包含提取区域的图像。

red_segment = cv2.bitwise_and(img, img, mask=mask_red)

查找红色区域的中心

为了找到红色区域的中心,我们需要找到红色区域的轮廓。使用cv2.threshold()函数将图像转换为二进制图像。

gray = cv2.cvtColor(red_segment, cv2.COLOR_BGR2GRAY)

_, threshold = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY)

然后,我们使用cv2.findContours()函数来计算图像的轮廓和层次结构。

contours, hierarchy = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

接下来,使用cv2.moments()函数来计算轮廓的矩。这将生成一个包含轮廓中心坐标的字典。

for c in contours:

moment = cv2.moments(c)

if moment["m00"] != 0:

x = int(moment["m10"] / moment["m00"])

y = int(moment["m01"] / moment["m00"])

print("Red object found at [{},{}]".format(x, y))

cv2.circle(img, (x, y), 10, (0, 0, 255), -1)

最后,我们将在原始图像中绘制红色区域的中心,并在终端输出它们的坐标。

cv2.imshow("Red Object Detection", img)

cv2.waitKey(0)

cv2.destroyAllWindows()

方法的细节实现如下:

import numpy as np

import cv2

# Load the image

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

# Convert to HSV color space

hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# Define the range of red color in HSV

low_red = np.array([0,50,50])

high_red = np.array([10,255,255])

low_red2 = np.array([160,50,50])

high_red2 = np.array([180,255,255])

# Threshold the HSV image to get only red colors

mask_red = cv2.inRange(hsv_img, low_red, high_red)

mask_red2 = cv2.inRange(hsv_img, low_red2, high_red2)

mask_red = cv2.bitwise_or(mask_red, mask_red2)

# Bitwise-AND mask and original image

red_segment = cv2.bitwise_and(img, img, mask=mask_red)

# Convert the red segment image to grayscale

gray = cv2.cvtColor(red_segment, cv2.COLOR_BGR2GRAY)

# Threshold the grayscale image to get a binary image

_, threshold = cv2.threshold(gray, 10, 255, cv2.THRESH_BINARY)

# Find the contours in the binary image

contours, hierarchy = cv2.findContours(threshold, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Draw a circle at the center of each contour

for c in contours:

moment = cv2.moments(c)

if moment["m00"] != 0:

x = int(moment["m10"] / moment["m00"])

y = int(moment["m01"] / moment["m00"])

print("Red object found at [{},{}]".format(x, y))

cv2.circle(img, (x, y), 10, (0, 0, 255), -1)

# Display the original image with the red object center marked

cv2.imshow("Red Object Detection", img)

cv2.waitKey(0)

cv2.destroyAllWindows()

总结

在本文中,我们介绍了如何使用OpenCV识别图像中的红色区域。我们使用了HSV颜色空间来处理图像,并通过二进制掩码提取红色区域。然后,我们找到了红色区域的中心,并在原始图像中绘制了红色区域的中心。此方法可以用于任何颜色,只需将颜色范围调整为所需范围即可。

后端开发标签