Python-单色图像上的矩形轮廓

Python-单色图像上的矩形轮廓,python,opencv,image-processing,Python,Opencv,Image Processing,我试图画一个绿色图像周围的矩形轮廓 我能画出最大的矩形,但不能在单一颜色上画 任何帮助都会很好 预期结果是矩形形状的亮绿色部分的裁剪图像 我的代码是-: 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

我试图画一个绿色图像周围的矩形轮廓

我能画出最大的矩形,但不能在单一颜色上画

任何帮助都会很好

预期结果是矩形形状的亮绿色部分的裁剪图像

我的代码是-:

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()

任何建议和帮助都可以帮助我在屏幕上的矩形形状中绘制单一颜色的轮廓。

通常,通过将图像转换为不同的颜色空间并分割各个通道来查看哪些通道最适合区分颜色,您可以很好地了解如何分离图像中的对象。因此,如果你对你的图像做了这样的处理,你会得到:

最上面一行是实验室颜色空间中的图像,左侧是亮度,然后是a,然后是b

第二行是HSL颜色空间,左边是色调,然后是饱和度,然后是亮度

随后的行是YIQ、XYZ、RGB

您可以使用cvtColor在OpenCV中获取其中的每一项

现在你看看这些图像,看看什么能让你的液晶显示器与众不同

绿色看起来不错,但包括LCD左侧上方的黄色 同样轻盈 饱和度看起来不错,但也包括图像的右下角
它看起来像是顶行的a和第三行的Q可能很好,在这两种情况下,你都可以得到暗色调

通常,通过将图像转换为不同的颜色空间并分割出各个通道来查看哪些通道最适合区分颜色,您可以很好地了解如何分离图像中的对象。因此,如果你对你的图像做了这样的处理,你会得到:

最上面一行是实验室颜色空间中的图像,左侧是亮度,然后是a,然后是b

第二行是HSL颜色空间,左边是色调,然后是饱和度,然后是亮度

随后的行是YIQ、XYZ、RGB

您可以使用cvtColor在OpenCV中获取其中的每一项

现在你看看这些图像,看看什么能让你的液晶显示器与众不同

绿色看起来不错,但包括LCD左侧上方的黄色 同样轻盈 饱和度看起来不错,但也包括图像的右下角
它看起来像是顶行的a和第三行的Q可能很好,在这两种情况下,你都可以得到暗色调

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

结果:

代码:


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

结果:

代码:


请检查你的帖子中拼写检查器引入的错误。另外,请显示一个额外的图像与预期的结果。谢谢。@MarkSetchell预期的结果是明亮的绿色矩形部分的裁剪图像。一个帮助将是巨大的,请检查您的帖子的错误介绍了无用的StackOverflow拼写检查器。另外,请显示一个额外的图像与预期的结果。谢谢。@MarkSetchell预期的结果是明亮的绿色矩形部分的裁剪图像。帮个忙就好了
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()