如何使用 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)