Python-图片上单一颜色的矩形轮廓

时间:2019-02-09 10:28:11

标签: python opencv image-processing

我正在尝试在绿色图像周围绘制矩形轮廓

我能够绘制最大的矩形,但无法专门绘制单色。

任何帮助都会很棒。

Image which needs to be contoured over

预期结果是将明亮的绿色部分的图像裁剪为矩形。

我的代码是-:

import cv2
import numpy as np

median = cv2.imread("try.png", 0)
image_gray = median 
image_gray = np.where(image_gray > 30, 255, image_gray)
image_gray = np.where(image_gray <= 30, 0, image_gray)
image_gray = cv2.adaptiveThreshold(image_gray, 255,
                           cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                           cv2.THRESH_BINARY_INV, 115, 1)
_, contours, _ = cv2.findContours(image_gray, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
rect_cnts = []
for cnt in contours:
    peri = cv2.arcLength(cnt, True)
    approx = cv2.approxPolyDP(cnt, 0.04 * peri, True)
    (x, y, w, h) = cv2.boundingRect(cnt)
    ar = w / float(h)
    if len(approx) == 4: # shape filtering condition
        rect_cnts.append(cnt)
max_area = 0
football_square = None
for cnt in rect_cnts:
    (x, y, w, h) = cv2.boundingRect(cnt)
    if max_area < w*h:
        max_area = w*h
        football_square = cnt

# Draw the result
image = cv2.cvtColor(image_gray, cv2.COLOR_GRAY2RGB)
cv2.drawContours(image, [football_square], -1, (0, 0,255), 5)
cv2.imshow("Result Preview", image)
cv2.waitKey()

任何建议和帮助都将有助于我仅在矩形的屏幕上用单色绘制轮廓。

2 个答案:

答案 0 :(得分:3)

正如@MarkSetchell所说,其他色彩空间可以使此操作更容易。例如,下面我将您的图像转换为HSV。然后我使用inRange创建一个遮罩,该遮罩可容纳亮绿色区域。接下来,选择最大轮廓,即屏幕。然后使用轮廓的boundingRect创建新图像。

结果:
enter image description here

代码:

import numpy as np 
import cv2
# load image
image = cv2.imread('d3.jpg')
# create hsv
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

 # set lower and upper color limits
low_val = (60,180,160)
high_val = (179,255,255)
# Threshold the HSV image 
mask = cv2.inRange(hsv, low_val,high_val)
# find contours in mask
ret, contours, hierarchy = cv2.findContours(mask,cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# select the largest contour
largest_area = 0
for cnt in contours:
    if cv2.contourArea(cnt) > largest_area:
        cont = cnt
        largest_area = cv2.contourArea(cnt)

# get the parameters of the boundingbox
x,y,w,h = cv2.boundingRect(cont)

# create and show subimage
roi = image[y:y+h, x:x+w]
cv2.imshow("Result", roi)

#  draw box on original image and show image
cv2.rectangle(image, (x,y),(x+w,y+h), (0,0,255),2)
cv2.imshow("Image", image)

cv2.waitKey(0)
cv2.destroyAllWindows()

答案 1 :(得分:2)

通常,您可以将图像中的对象转换为不同的色彩空间,并拆分各个通道以查看最能区分颜色的对象,从而获得一个很好的主意。因此,如果对图像执行此操作,则会得到以下信息:

enter image description here

  • 第一行是 Lab 色彩空间中的图像,“亮度”位于左侧,然后依次是 a b

  • 第二行是 HSL 色彩空间,左侧是色调,然后是饱和度,然后是亮度< / strong>。

随后的行是 YIQ XYZ RGB

您可以使用cvtColor() OpenCV 中获取它们。

现在,您查看图像,看看将使您的LCD显示屏与众不同。

  • 绿色看起来不错,但在LCD左侧上方包括黄色
  • 类似亮度
  • 饱和度看起来不错,但还包括图像的右下角

第一行的 a 和第三行的 Q 看起来不错,在两种情况下您都将阈值设置为暗色调。