自用 图片旋转&去黑边

非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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值