• 图像旋转后出现黑点


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

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

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

  • 相关阅读:
    2015-10-09 Fri 晴 加快进度看书
    lseek()函数
    pipe()管道最基本的IPC机制
    linux VFS 内核数据结构
    tcp协议中mss的理解
    tcp的精髓:滑动窗口
    2015-10-11 Sunday 晴 ARM学习
    2015-10-12 晴 审面包车
    2015-10-14 晴 tcp/ip
    pyfits过滤数据更新文件。
  • 原文地址:https://www.cnblogs.com/adjwang/p/11839435.html
Copyright © 2020-2023  润新知