首页 > 技术文章 > 图像旋转后出现黑点 - (一) - 入坑

adjwang 2019-11-12 01:32 原文

今天用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,精度丢失,有些像素会叠到一起,有些是空的,所以就变成桌布了。

谜一样的图案,并非有心为之,这就是数学之美吧……

(后续:消除黑点的方法见填坑篇)

推荐阅读