我正在尝试在绿色图像周围绘制矩形轮廓
我能够绘制最大的矩形,但无法专门绘制单色。
任何帮助都会很棒。
预期结果是将明亮的绿色部分的图像裁剪为矩形。
我的代码是-:
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()
任何建议和帮助都将有助于我仅在矩形的屏幕上用单色绘制轮廓。
答案 0 :(得分:3)
正如@MarkSetchell所说,其他色彩空间可以使此操作更容易。例如,下面我将您的图像转换为HSV。然后我使用inRange创建一个遮罩,该遮罩可容纳亮绿色区域。接下来,选择最大轮廓,即屏幕。然后使用轮廓的boundingRect创建新图像。
代码:
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)
通常,您可以将图像中的对象转换为不同的色彩空间,并拆分各个通道以查看最能区分颜色的对象,从而获得一个很好的主意。因此,如果对图像执行此操作,则会得到以下信息:
第一行是 Lab 色彩空间中的图像,“亮度”位于左侧,然后依次是 a 和 b ,
第二行是 HSL 色彩空间,左侧是色调,然后是饱和度,然后是亮度< / strong>。
随后的行是 YIQ , XYZ , RGB 。
您可以使用cvtColor()
在 OpenCV 中获取它们。
现在,您查看图像,看看将使您的LCD显示屏与众不同。
第一行的 a 和第三行的 Q 看起来不错,在两种情况下您都将阈值设置为暗色调。