OpenCV python裁剪图像

Posted

技术标签:

【中文标题】OpenCV python裁剪图像【英文标题】:OpenCV python cropping image 【发布时间】:2017-01-25 18:32:27 【问题描述】:

我创建了黑色图像,然后在该图像中绘制了一个红色矩形。之后我裁剪了这张图片并使用命令在 cropped 图像中绘制了另一个矩形。 cv2.rectangle(crop,(50,50),(150,150),(0,0,255),3)

为什么当我在最后显示第二个矩形时,它会出现在原始图像中?我希望只看到第一个矩形。

import cv2
import numpy as np

#create image
image = np.zeros((400,400,3), np.uint8)

#draw rectangle into original image
cv2.rectangle(image,(100,100),(300,300),(0,0,255),3)

#crop image
crop = image[100:300,100:300]

#draw rectangle into cropped image
cv2.rectangle(crop,(50,50),(150,150),(0,0,255),3)
cv2.imshow('Result', image)
cv2.waitKey()    

cv2.destroyAllWindows()

【问题讨论】:

【参考方案1】:

crop = image[100:300,100:300] 在原始图像上创建一个视图,而不是一个新对象。修改该视图将修改底层的原始图像。详情请见http://scipy-cookbook.readthedocs.io/items/ViewsVsCopies.html

您可以通过在裁剪时创建副本来解决此问题: crop = image[100:300,100:300].copy().

注意:image[100:300,100:300] 参数是 y: y+h, x: x+w 不是 x: x+w, y: y+h

【讨论】:

【参考方案2】:

如果要保存裁剪后的图像,只需添加以下代码:

cv2.imwrite("Cropped.jpg", roi)

after cv2.imshow("Cropped", roi)

我希望这会有所帮助。

【讨论】:

【参考方案3】:

您可以使用 python 轻松裁剪图像

roi = oriImage[refPoint[0][1]:refPoint[1][1], refPoint[0][0]:refPoint[1][0]]

为了获得这两个积分,您可以致电cv2.setMouseCallback("image", mouse_crop)。 函数是这样的

def mouse_crop(event, x, y, flags, param):
    # grab references to the global variables
    global x_start, y_start, x_end, y_end, cropping

    # if the left mouse button was DOWN, start RECORDING
    # (x, y) coordinates and indicate that cropping is being
    if event == cv2.EVENT_LBUTTONDOWN:
        x_start, y_start, x_end, y_end = x, y, x, y
        cropping = True

    # Mouse is Moving
    elif event == cv2.EVENT_MOUSEMOVE:
        if cropping == True:
            x_end, y_end = x, y

    # if the left mouse button was released
    elif event == cv2.EVENT_LBUTTONUP:
        # record the ending (x, y) coordinates
        x_end, y_end = x, y
        cropping = False # cropping is finished

        refPoint = [(x_start, y_start), (x_end, y_end)]

        if len(refPoint) == 2: #when two points were found
            roi = oriImage[refPoint[0][1]:refPoint[1][1], refPoint[0][0]:refPoint[1][0]]
            cv2.imshow("Cropped", roi)

您可以从这里获取详细信息:Mouse Click and Cropping using Python

【讨论】:

以上是关于OpenCV python裁剪图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 OpenCV 和 Python 裁剪图像的轮廓

使用 Python 的 OpenCV 函数裁剪图像 [重复]

opencv-python:如何用边界框坐标裁剪图像[重复]

Opencv在python中裁剪平行四边形图像[重复]

在 OpenCV (Python) 中使用校正失真裁剪图像

Opencv和python用于自动裁剪