图像旋转后出现黑点 - (一) - 入坑
今天用Python写了下图像旋转的程序,发现旋转后的图像有一些花纹一样的黑点,非常奇妙,不知道是怎么回事……
1 # !/usr/bin/env python3 2 # -*-coding:utf-8-*- 3 import numpy as np 4 # np.set_printoptions(suppress=True) # 关闭科学计数法 5 import cv2 6 7 # 旋转矩阵R 8 ANGLE = 30 # (dim=°) 9 alpha = ANGLE/360*2*np.pi 10 R = np.matrix([[np.cos(alpha), -np.sin(alpha)], 11 [np.sin(alpha), np.cos(alpha)]]) 12 print(R) 13 14 # 图片读取、灰度化 15 HEIGHT, WIDTH = 640, 480 16 img = cv2.imread('timg.jpg') 17 # img = cv2.resize(img, (1280, 850)) 18 img = cv2.resize(img, (HEIGHT, WIDTH)) 19 img_gray = np.float32(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)) 20 print(img_gray.shape) 21 22 ori_img_index = np.array([(x, y) for x in range(WIDTH) for y in range(HEIGHT)]) # 原始像素坐标 23 new_img_index = np.array(list(map(R.dot, ori_img_index)), dtype=np.int32).reshape(WIDTH*HEIGHT, 2) # 坐标变换 24 new_img_index -= np.min(new_img_index, axis=0) # 坐标平移,防止旋转后被窗口切分 25 26 h, w = np.max(new_img_index, axis=0) # 旋转后画布大小 27 # 像素映射 原始→新图 28 new_img = np.zeros((h+1, w+1)) 29 for index1, index0 in zip(new_img_index, ori_img_index): 30 new_img[index1[0], index1[1]] = img_gray[index0[0]][index0[1]] 31 32 cv2.imwrite('./AffinedImg.jpg', new_img, [int(cv2.IMWRITE_JPEG_QUALITY),95]) 33 # 显示图片 34 cv2.imshow('img', np.array(new_img, dtype=np.uint8)) 35 cv2.waitKey(0) 36 cv2.destroyAllWindows()
其中timg.jpg就是一张普通的jpg图片。
原图:timg.jpg
旋转后的灰度图片:可以看到图片上多了一片奇妙形状的花纹,感觉这花纹可以拿来印桌布了,哈哈。
莫名其妙,一头雾水,稀里糊涂,不明所以……数学真难。
好吧……经历一番思考,貌似明白了,坐标变换的时候数据类型从float转成int,精度丢失,有些像素会叠到一起,有些是空的,所以就变成桌布了。
谜一样的图案,并非有心为之,这就是数学之美吧……
(后续:消除黑点的方法见填坑篇)
Perfection is achieved not when there is nothing more to add, but rather when there is nothing more to take away.
-- Antoine de Saint-Exupéry