如何裁剪图像中红点周围的固定补丁

How do I crop Fixed Patches around the red dots in an image

我是 OpenCV 的新手,我什至不知道如何解决这个问题。我有这张 500x500 像素的图片,里面有红点和白线。

以每个红点为中心,我可以在红点周围画一个25X25大小的固定边界框吗?我需要识别图像中的每个红点。

注意:条件是我需要找到一个固定大小(25x25)的边界框,红点必须在边界框的中心。

如有任何帮助,我们将不胜感激。提前谢谢你。

以下是如何使用 HSV 蒙版来屏蔽图像中除红色像素以外的所有内容:

import cv2
import numpy as np

def draw_box(img, cnt):
    x, y, w, h = cv2.boundingRect(cnt)
    half_w = w // 2
    half_h = h // 2
    x1 = x + half_h - 12
    x2 = x + half_h + 13
    y1 = y + half_w - 12
    y2 = y + half_w + 13
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0))

img = cv2.imread("red_dots.png")

img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
ranges = np.array([[100, 0, 0], [179, 255, 255]])
mask = cv2.inRange(img_hsv, *ranges)
img_masked = cv2.bitwise_and(img, img, mask=mask)

img_gray = cv2.cvtColor(img_masked, cv2.COLOR_BGR2GRAY)
contours, _ = cv2.findContours(img_gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

for cnt in contours:
    draw_box(img, cnt)
    
cv2.imshow("Image", img)
cv2.waitKey(0)

输出:

draw_box()函数这部分注意事项:

    x1 = x + half_h - 12
    x2 = x + half_h + 13
    y1 = y + half_w - 12
    y2 = y + half_w + 13

理想情况下,不是- 12+ 13,而是- 12.5+ 12.5,但是OpenCV中不能有半个像素,否则会出错抛出。

另一个解决方案,使用numpy slicing to get the red channel, where to create a mask of the red dots and cv2.findContours 得到点的边界矩形。我们可以使用此信息绘制新的 25 x 25 个矩形:

# Imports
import cv2
import numpy as np

# Read image
imagePath = "C://opencvImages//"
inputImage = cv2.imread(imagePath + "oHk9s.png")

# Deep copy for results:
inputImageCopy = inputImage.copy()

# Slice the Red channel from the image:
r = inputImage[:, :, 2]
# Convert type to unsigned integer (8 bit):
r = np.where(r == 237, 255, 0).astype("uint8")

# Extract blobs (the red dots are all the white pixels in this mask):
contours, _ = cv2.findContours(r, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE)

# Store bounding rectangles here:
boundingRectangles = []

# Loop through the blobs and draw a 25 x 25 green rectangle around them:
for c in contours:
    # Get dot bounding box:
    x, y, w, h = cv2.boundingRect(c)

    # Set new bounding box dimensions:
    boxWidth = 25
    boxHeight = 25
    # Center rectangle around blob:
    boxX = int(x + 0.5 * (w - boxWidth))
    boxY = int(y + 0.5 * (h - boxHeight))

    # Store data:
    boundingRectangles.append((boxX, boxY, boxWidth, boxHeight))

    # Draw and show new bounding rectangles
    color = (0, 255, 0)
    cv2.rectangle(inputImageCopy, (boxX, boxY), (boxX + boxWidth, boxY + boxHeight), color, 2)
    cv2.imshow("Boxes", inputImageCopy)
    cv2.waitKey(0)

此外,我在 boundingRectangles 列表中存储了矩形的左上角坐标、宽度和高度。这是输出: