如何使用 Open CV 3 python 3 用鼠标从大图像中裁剪 ROI

Posted

技术标签:

【中文标题】如何使用 Open CV 3 python 3 用鼠标从大图像中裁剪 ROI【英文标题】:How to Crop ROI from large images with mouse using Open CV 3 python 3 【发布时间】:2018-02-16 08:46:44 【问题描述】:

我可以成功地从small images 裁剪投资回报率。 但是当我为large images尝试相同的代码时,由于屏幕分辨率小,窗口无法打开完整图像。我已经调整了图像的大小以适合窗口,但是在我调整裁剪后的图像大小时,它的像素值已更改。opencv 有什么方法可以使像素值保持不变。

import cv2
import numpy as np
refPt = []
cropping = False        
def click_and_crop(event, x, y, flags, param):

    global refPt, cropping
    if event == cv2.EVENT_LBUTTONDOWN:
        refPt = [(x, y)]
        cropping = True
    elif event == cv2.EVENT_LBUTTONUP:
        refPt.append((x, y))
        cropping = False
        cv2.rectangle(clone1, refPt[0], refPt[1], (0, 255, 0), 2)
        cv2.imshow("image", clone1)

image = cv2.imread('orig.jpg')
x,y,z=np.shape(image)
clone1=cv2.resize(image,(592,700),interpolation=cv2.INTER_AREA)

clone=clone1.copy()
cv2.namedWindow("image")
cv2.setMouseCallback("image", click_and_crop)
while True:
    cv2.imshow("image", clone1)
    key=cv2.waitKey(1) & 0xFF
    if key == ord("r"):
        clone1 = clone.copy()
    if key == ord("c"):
        break
if len(refPt) == 2:
    roi = clone[refPt[0][1]:refPt[1][1], refPt[0][0]:refPt[1][0]]
    roi1 = cv2.resize(roi,(y,x),interpolation=cv2.INTER_AREA)
    cv2.imwrite("ROI", roi1)
    cv2.waitKey(0)
    print('Cropping Complete')
    cv2.destroyAllWindows()

【问题讨论】:

缩放图像以适应您的屏幕分辨率,然后缩放所选的 roi。 缩放会导致像素值丢失。我不想丢失任何信息 您可以将其缩放以用于可视化目的...您的 roi 大小可能会变化 1-2 像素,但信息会在那里 要么按照建议调整大小,要么使用 Qt 等更好的 gui 工具包。 我编辑了问题,请检查 【参考方案1】:

调整图像的大小,以获得小图像的比例。例如将长度减小 5 倍,宽度减小 2 倍。

clone1=cv2.resize(image,(y/2,x/5),interpolation=cv2.INTER_AREA)

然后将上述常数与小图像的参考点相乘,得到原始图像的参考点。

a,b,c,d=(refPt[0][1])*5,(refPt[1][1])*5,(refPt[0][0])*2,(refPt[1][0])*2

现在使用这些参考点从原始图像中获取 roi

roi1=image[a:b, c:d]

【讨论】:

最好在您的答案中添加一些解释。否则它可能会被删除。【参考方案2】:

你有没有尝试在显示图像之前定义窗口的参数? 您可以尝试以下方法:

cv2.namedWindow("image", cv2.WINDOW_NORMAL)

cv2.imshow("image", clone1)

一旦您显示图像,它将适合您的显示器,并且像素值相同,因为您没有使用任何插值调整影响像素强度的图像大小。

【讨论】:

以上是关于如何使用 Open CV 3 python 3 用鼠标从大图像中裁剪 ROI的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV基本功 之 图像的掩模运算 & 合并专题 -小啾带学Python-Open_CV系列

Python - 如何使用Open-cv或PIL将24位PNG图像转换为32位

OpenCV滤波器 龙门石窟篇Python-Open_CV系列(均值滤波器中值滤波器高斯滤波器双边滤波器)

安卓游戏自动化控制实验!超详细!小白也能一学就会!(Python + uiautomator2 + Open CV)

小啾带你开天眼 之 开启py-OpenCV摄像头及视频处理Python-Open_CV系列

如何在 OpenCV 2.4.3 中编写视频文件