我可以成功从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()
答案 0 :(得分:0)
调整图像大小,使得获得小图像的比例。例如,将长度减少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]
答案 1 :(得分:0)
在显示图像之前,您是否尝试定义窗口的参数? 您可以尝试以下方法:
cv2.namedWindow("image", cv2.WINDOW_NORMAL)
cv2.imshow("image", clone1)
显示图像后,它将适合您的显示器,并且像素值相同,因为您没有使用任何插值调整影响像素强度的图像大小。