python - 在 python 中使用 opencv 剪切图像的特定部分

标签 python opencv crop

我有一个 IC 芯片的图像,我想切掉中心的标记。标记始终位于左下角圆圈上方的特定位置。 我的想法是首先找到我已经用霍夫圆变换完成的圆位置。现在我想剪掉标记所在的部分。理想情况下,它应该不是正方形或矩形,而是更像图像中的东西:

example

这是我的代码的一部分:

        cimg = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR)
        circles = cv2.HoughCircles(morph_image, cv2.HOUGH_GRADIENT, 1.3, 20, param1=50, param2=25, minRadius=15,
                                   maxRadius=19)

        if circles is not None:
            circles = np.uint16(np.around(circles))
            for i in circles[0, :]:
                # Zeichne äußeren Kreis
                cv2.circle(cimg, (i[0], i[1]), i[2], (0, 255, 0), 2)
                # Zeichne Kreiszentrum
                cv2.circle(cimg, (i[0], i[1]), 2, (0, 0, 255), 3)
                # Tupel mit x- und y-Koordinaten des Kreiszentrums
                circle_center = (i[0], i[1])
                print('Die Koordinaten des Kreiszentrums lauten: ', circle_center)
                """cv2.imshow('Kreis', cimg)
                cv2.waitKey(0)
                cv2.destroyAllWindows()"""
        else:
            circle_center = None
            print('Kein Kreis gefunden')
            """cv2.imshow('Kein Kreis', cimg)
            cv2.waitKey(0)
            cv2.destroyAllWindows()"""

所以我的 cicle center 有我的圆的中心位置(例如 (124, 370))。如何自动剪切图像的这一部分?我能以某种方式裁剪它吗?理想情况下,我想将标记裁剪到另一个图像中以单独检查它,但是使用 marking_img = img[y:y+h, x:x+w] 的正常裁剪方法行不通我猜猜。

编辑: 这是原始图像:

enter image description here

输出应该像第一张图片,如果可能的话:

enter image description here

所以最后我想要两张图片:一张只有骰子没有标记的图片和一张只有标记的图片

最佳答案

这是 Python/OpenCV 中的一种方法。

  • 阅读图片
  • 阅读面具(与另一张图片分开创建一次)
  • 将掩码转换为灰色并将其阈值化为二进制,将其反转并使其成为 3 个 channel
  • 从您自己的代码中获取圆心。 (我刚刚手动测量过)
  • 设置文本区域底部距圆心的预期 x,y 偏移量
  • 从圆心计算蒙版的预期左上角、蒙版图像的偏移量和高度
  • 将蒙版放入该位置输入大小的黑色图像
  • 将新蒙版应用于图像,使图像的其余部分变黑
  • 从左上角裁剪出感兴趣的区域和原始mask的大小
  • 可选地,裁剪原始图像
  • 保存结果

输入图片:

enter image description here

准备好的蒙版图片:

enter image description here

import cv2
import numpy as np

# read image
img = cv2.imread('die.jpg')
ht, wd, cc = img.shape

# read mask as grayscale
mask = cv2.imread('die_mask.png', cv2.IMREAD_GRAYSCALE)

# threshold mask and invert
mask = cv2.threshold(mask,0,255,cv2.THRESH_BINARY)[1]
mask = 255 - mask
hh, ww = mask.shape

# make mask 3 channel
mask = cv2.merge([mask,mask,mask])

# set circle center
cx = 62
cy = 336

# offsets from circle center to bottom of region
dx = -20
dy = -27

# compute top left corner of mask using size of mask and center and offsets
left = cx + dx
top = cy + dy - hh

# put mask into black background image
mask2 = np.zeros_like(img)
mask2[top:top+hh, left:left+ww] = mask

# apply mask to image
img_masked = cv2.bitwise_and(img, mask2)

# crop region
img_masked_cropped = img_masked[top:top+hh, left:left+ww]

# ALTERNATE just crop input
img_cropped = img[top:top+hh, left:left+ww]

cv2.imshow('image', img)
cv2.imshow('mask', mask)
cv2.imshow('mask2', mask2)
cv2.imshow('masked image', img_masked)
cv2.imshow('masked cropped image', img_masked_cropped)
cv2.imshow('cropped image', img_cropped)
cv2.waitKey(0)
cv2.destroyAllWindows()

# save results
cv2.imwrite('die_mask_inserted.jpg', mask2)
cv2.imwrite('die_masked_image.jpg', img_masked)
cv2.imwrite('die_masked_cropped.jpg', img_masked_cropped)
cv2.imwrite('die_cropped.jpg', img_cropped)


黑色图像中插入的蒙版:

enter image description here

蒙版图片:

enter image description here

蒙版图像裁剪:

enter image description here

(可选)输入图像的裁剪:

enter image description here

关于python - 在 python 中使用 opencv 剪切图像的特定部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61497956/

相关文章:

python - cx_Freeze "no module named google"错误

python - numpy.array() 中的顺序参数有什么作用,也就是什么是连续顺序?

opencv - 将 ffmpeg 流传递给 OpenCV

android - 从图库中裁剪图像会导致应用程序崩溃 - Android

ios - 在 UIImageView 中显示之前裁剪图像

java - 如何使用 OS Lollipop 在 Android 中裁剪 Java 图像

python - 有没有办法使用 Folium 增加 18 以上图层的缩放?

python - 了解 maxmin 函数

opencv - LBP本地二进制模式,用于在正面进行嘴部检测

python - 视频在 opencv 上停止