检测黑色和黑色上的白色矩形白色图像和裁剪(OpenCV) [英] Detect white rectangle on black & white image and crop (OpenCV)

查看:84
本文介绍了检测黑色和黑色上的白色矩形白色图像和裁剪(OpenCV)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在努力将图像裁剪为矩形大小,该矩形位于图像内部.这是原图:

I'm struggling with cropping an image to the size of a rectangle, which is placed inside of the image. This is the original image:

到目前为止,我能够输入它,将其颜色转换为 HSV 颜色空间并对其应用阈值.到目前为止,这是我的代码:

So far I was able to input it, convert its colors to a HSV color space and applying threshold on it. This is my code so far:

import cv2

#Read input image
img = cv2.imread('rdm_generated_image.png')

#convert from BGR to HSV color space
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

#get the saturation plane - all black/white/gray pixels are zero, and colored pixels are above zero.
s = hsv[:, :, 1]

#apply threshold on s
ret, thresh = cv2.threshold(s, 8, 255, cv2.THRESH_BINARY)

#invert colors, so every dark spots are now white
image = cv2.bitwise_not(thresh)

cv2.imwrite("image.png", image)

完成后,程序输出:

现在我只想将图像裁剪到中间的大框,但我无法检测到它的轮廓.

Now I want to crop the image to the big box in the middle only, but I'm not able to detect the contours of it.

我用 cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 和其他一些函数尝试了它,但我还没有成功.如果这应该是错误的做法,请纠正我.感谢帮助,因为我对 OpenCV 没有经验.

I tried it with cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) and a few other functions, but I was not successful yet. If this should be the wrong way of doing it, please correct me. Help is appreciated, since I'm kind of unexperienced with OpenCV.

提前致谢!

推荐答案

这是在 Python/OpenCV 中执行此操作的一种方法.

Here is one way to do that in Python/OpenCV.

  • 阅读图片
  • 转换为灰色
  • 阈值
  • 寻找轮廓
  • 过滤大约预期区域
  • 绘制轮廓
  • 保存结果

输入:

import cv2
import numpy as np

#Read input image
img = cv2.imread('boxes.png')

#convert from BGR to HSV color space
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#apply threshold
thresh = cv2.threshold(gray, 30, 255, cv2.THRESH_BINARY)[1]

# find contours and get one with area about 180*35
# draw all contours in green and accepted ones in red
contours = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
contours = contours[0] if len(contours) == 2 else contours[1]
#area_thresh = 0
min_area = 0.95*180*35
max_area = 1.05*180*35
result = img.copy()
for c in contours:
    area = cv2.contourArea(c)
    cv2.drawContours(result, [c], -1, (0, 255, 0), 1)
    if area > min_area and area < max_area:
            cv2.drawContours(result, [c], -1, (0, 0, 255), 1)

# save result
cv2.imwrite("box_found.png", result)

# show images
cv2.imshow("GRAY", gray)
cv2.imshow("THRESH", thresh)
cv2.imshow("RESULT", result)
cv2.waitKey(0)


结果:

这篇关于检测黑色和黑色上的白色矩形白色图像和裁剪(OpenCV)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆