我设法制作了两个不同的代码,其中之一是从堆栈溢出的另一篇文章中获得的,这两个代码都可以在不使用任何openCV函数(例如resize)的情况下将图像放大,但它们都使用向后映射,但是我似乎无法将代码转换为前向映射,这将导致带有黑色“图案”像素的缩放图像。如果对链接解释是什么向前/向后映射有疑问,可以找到here
我对两个代码使用相同的图像。我已经看过正向映射的理论,但是到目前为止还无法实现,我不断收到我一直在尝试调试的错误,但到目前为止没有运气。有时我会得到全黑的图像,但是尺寸合适。
下面的代码是缩放的工作代码,而不是我尝试过向前映射的代码(如果需要的话),我也可以发布它。
代码:
import cv2 as cv
import numpy as np
img = cv.imread('Scale.jpg')
def upScaling(image, scale):
(h, w, dim) = img.shape
scaleH = h * scale
scaleW = w * scale
#making sure that the scale factor is an integer
sH = int(scaleH)
sW = int(scaleW)
# Get the ratio of the rows
row_ratio = h / scaleH
# Getting the ratio of the cols
column_ratio = w / scaleW
# i get a list position of the rows
row_position = np.floor(np.arange(sH) * row_ratio).astype(int)
#getting a list of position of the columns
column_position = np.floor(np.arange(sW) * column_ratio).astype(int)
# Initialize The scaled image called imageScaled
scaledUp = np.zeros((sH, sW, 3), np.uint8)
for i in range(sH):
for j in range(sW):
scaledUp[i, j] = img[row_position[i], column_position[j]]
return scaledUp
ScalingUp = upScaling(img, 1.3)
cv.imshow('Scaling up', ScalingUp)
代码#2 :
import cv2
import numpy as np
img = cv2.imread('Scale.jpg', 0)
cv2.imshow('unscaled', img)
h,w = img.shape[:2]
print(h)
print(w)
def resizePixels(pixels,w1,h1,w2,h2):
retval = []
x_ratio = (int)((w1<<16)/w2) +1
print(x_ratio)
y_ratio = (int)((h1<<16)/h2) +1
print(y_ratio)
for i in range(h2):
for j in range(w2):
x2 = ((j*x_ratio)>>16)
y2 = ((i*y_ratio)>>16)
#add pixel values from original image to an array
retval.append(pixels[y2,x2])
return retval;
ret = resizePixels(img,w,h,500,500)
#reshape the array to get the resize image
dst = np.reshape(ret,(500,500))
cv2.imshow('Resize',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
希望,有可能将我当前的代码转换为使用前向映射的版本,如果没有的话,我可以毫无疑问地编写新代码。