【问题标题】:Python - Rotate Image without using the built-in methods for rotationPython - 在不使用内置旋转方法的情况下旋转图像
【发布时间】:2021-05-13 10:29:31
【问题描述】:

如何借助 OpenCV 库在 Python 中旋转图像,并通过更改图像的高度和宽度值(不使用 OpenCV 中的内置旋转方法)。它必须使用两个嵌套循环来实现。

img=cv2.imread('Images/Screenshot.png',cv2.IMREAD_GRAYSCALE)

height, width = img.shape

# for i in range(0,height):
#     for j in range(0,width):
#         img[i][j]=

# show rotated image
cv2.imshow("image",img)

感谢您的关注!

【问题讨论】:

  • 你能发布一些你目前尝试过的代码吗?
  • @G.Anderson 我在帖子中添加了一些代码
  • 当您运行该代码时,另一端会出现什么,与您的预期相比如何?不要刻薄,真正好奇你的代码在做什么。您的意思是在循环中将img[i][j] 分配给img[j][i]
  • 拿一张graph paper(一个更大的正方形),画一个小网格,比如5x7,标记轴并填充一些“像素”。然后尝试绘制以您想要的方式旋转的相同事物。观察你使用什么算法来产生结果。 (或者更好的是,假设您必须通过电话指示朋友生成旋转图像。您会告诉他们一步一步地做什么。?)

标签: python opencv image-processing


【解决方案1】:

交换索引:

您可以使用np.zeros() 创建一个空图像,然后将当前图像中的像素读取到空图像中。您可以更改读取像素的顺序以执行一些基本旋转。以下示例应该会有所帮助。

测试图片:

img = cv2.imread('texas_longhorns_log.png')

向左旋转 90 度:

h,w,c = img.shape

empty_img = np.zeros([h,w,c], dtype=np.uint8)

for i in range(h):
    for j in range(w):
        empty_img[i,j] = img[j-1,i-1]
        empty_img = empty_img[0:h,0:w]

cv2.imwrite("tester1.png", empty_img)

向右旋转 90 度:

h,w,c = img.shape

empty_img = np.zeros([h,w,c], dtype=np.uint8)

for i in range(h):
    for j in range(w):
        empty_img[i,j] = img[h-j-1,w-i-1]
        empty_img = empty_img[0:h,0:w]

cv2.imwrite("tester2.png", empty_img)

旋转 180 度:

h,w,c = img.shape

empty_img = np.zeros([h,w,c], dtype=np.uint8)

for i in range(h):
    for j in range(w):
        empty_img[i,j] = img[h-i-1,w-j-1]
        empty_img = empty_img[0:h,0:w]

cv2.imwrite("tester3.png", empty_img)

【讨论】:

  • Hook Em Horns' :-)
  • 这不是旋转,而是翻转 - (R) 标记不应改变位置。
  • empty_img = empty_img[0:h,0:w] 完全是多余和荒谬的。
  • @ChristophRackwitz 你是对的。我认为,当时,我的意图是在循环之前裁剪到原始图像的高度和宽度,因为一个像素错误。然而,正如您所提到的,这发生在第二个嵌套循环中的事实非常愚蠢。考虑到 querant 带来的任意约束,整个 Q&A 毫无用处。
  • 这对 N*M 数组有效吗?因为我的逆时针旋转 90 度时出错,但顺时针旋转时出错。 ` new_img[i,j] =img[j-1,i-1] IndexError: index 657 is out of bounds for axis 1 with size 657`
【解决方案2】:

如果您需要在 OpenCV 中进行简单的旋转,它是内置的:

img=cv2.imread('Images/Screenshot.png',cv2.IMREAD_GRAYSCALE)

imgrot = cv2.rotate(img,cv2.ROTATE_90_CLOCKWISE)

其他可能是cv2.ROTATE_90_COUNTERCLOCKWISEcv2.ROTATE_180

【讨论】:

  • 这就是答案。不知道为什么它不是最佳解决方案。
【解决方案3】:

必须是 OpenCv 吗?因为如果不是,您可以使用 PIL 轻松完成:

from PIL import Image

def rotate_img(img_path, rt_degr):
    img = Image.open(img_path)
    return img.rotate(rt_degr, expand=1)

img_rt_90 = rotate_img('Images/Screenshot.png', 90)
img_rt_90.save('img_rt_90.png')

【讨论】:

  • 这将大大降低图像质量。
【解决方案4】:

我用的是PIL包,做起来很简单。

from PIL import Image
path = '/Users/diegodsp/sample.jpg'
img = Image.open(path)
img = img.rotate(90) # 90, -90, 180, ...
img.save(path) # to override your old file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    • 1970-01-01
    相关资源
    最近更新 更多