非pi/2的倍数效果不好
import numpy as np
import cv2
def rotation(img, r=15):
h, w = img.shape[:2]
ground = w+h
r = np.pi * r / 180
tr = [[np.cos(r), -np.sin(r)], [np.sin(r), np.cos(r)]]
tr90 = [[0, -1], [1, 0]]
blank = np.zeros((ground, ground, 3), dtype=img.dtype)
for i in range(h):
for j in range(w):
i_t, j_t = np.dot([i - w/2, j - h/2], tr)
i_t = np.int64(i_t + ground/2)
j_t = np.int64(j_t - ground/2)
blank[i_t, j_t] = img[i, j]
return blank
def remove_black_border(img):
h, w = img.shape[:2]
res_h_u, res_h_d, res_w_l, res_w_r = 0, h, 0, w
count = 0
# 上到下
all_black = True
for i in range(h):
for j in range(w):
if np.count_nonzero(img[i, j]) > 0:
all_black = False
break
if all_black:
res_h_u = res_h_u + 1
# 下到上
all_black = True
for i in range(h - 1, -1, -1):
for j in range(w):
if np.count_nonzero(img[i, j]) > 0:
all_black = False
break
if all_black:
res_h_d = res_h_d - 1
# 左到右
all_black = True
for i in range(w):
for j in range(h):
if np.count_nonzero(img[j, i]) > 0:
all_black = False
break
if all_black:
res_w_l = res_w_l + 1
# 右到左
all_black = True
for i in range(w - 1, -1, -1):
for j in range(h):
if np.count_nonzero(img[j, i]) > 0:
all_black = False
break
if all_black:
res_w_r = res_w_r - 1
return img[res_h_u:res_h_d, res_w_l:res_w_r]
def main():
img = cv2.imread("cat.bmp")
res = rotation(img, 30)
res = remove_black_border(res)
cv2.imshow("output,", res)
cv2.waitKey(0)
if __name__ == '__main__':
main()