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

Time:01-05

I am new to OpenCV and I am not even sure how to tackle this problem. I have this image of 500x500 pixel with red dots and white lines in it.

enter image description here

Considering each red dot as center and could I draw a fixed bounding box of 25X25 size around the red dot? I need to identify every red dot in the image.

enter image description here

Note: condition is that I need to find a bounding box of fixed size (25x25) and the red dot must be in the center of the bounding box.

Any help would be appreciated. Thank you in advance.

CodePudding user response:

Here is how you can use an HSV mask to mask out everything in your image except for the red pixels:

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)

Output:

enter image description here

Notice at this part of the draw_box() function:

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

Ideally, instead of - 12 and 13, it should be - 12.5 and 12.5, but there cannot be half pixels in OpenCV, or an error would be thrown.

CodePudding user response:

Another solution, using enter image description here

  •  Tags:  
  • Related