• numpy 用于图像处理


    1. 转换为灰度图

    灰度图的数据可以看成是二维数组,元素取值为0 ~ 255,其中,0为黑色,255为白色。从0到255逐渐由暗色变为亮色。
    灰度图转换(ITU-R 601-2亮度变换):
    L = R * 299 / 1000 + G * 587 / 1000 + B * 114 / 1000
    R,G,B为最低维的数据。
    显示灰度图时,需要在imshow中使用参数:
    cmap="gray"

    import numpy as np
    import cv2
    import matplotlib.pyplot as plt
    from PIL import Image
    
    import numpy as np
    
    def get_color_channels(img):
        img = img.copy()
        channels_num = len(img.shape)
        result = []
        
        channels = np.split(img, channels_num, axis=2)
        for i in channels:
            result.append(i.sum(axis=2)) 
        return result
        
    # 其实没必要这么麻烦,只需要return img[:,:,0], img[:,:,1], img[:,:,2]即可
    
    # img = cv2.imread('/home/geoffrey/图片/小熊猫.png') # opencv返回BGR,需要转换颜色通道
    img = Image.open('/home/geoffrey/图片/小熊猫.jpeg')
    img = np.array(img)
    
    # img.transpose(0,1,2) 
    plt.imshow(img)
    plt.show()
    

    img.shape
    
    (559, 700, 3)
    

    分离通道

    R, G, B, = get_color_channels(img)
    R.shape
    
    (559, 700)
    

    生成白色图片,每个像素都是1.0

    w = np.ones((500,500,3)) # 由于默认np.float64类型,对浮点数取比例,即1.0,对应整形255。
    plt.imshow(w)
    plt.show()
    

    生成黑色图片,每个像素都是0, 方法1

    w = np.zeros(shape=(500,500,3), dtype=np.uint8)
    plt.imshow(w)
    plt.show()
    

    生成自定义颜色图片

    w = np.full(shape=(500,500,3), fill_value=125 , dtype=np.uint8)
    w[:] = [0,238,225] # 广播操作
    plt.imshow(w)
    plt.show()
    

    转换为灰度图像方法1:

    L = R * 299 / 1000 + G * 587 / 1000 + B * 114 / 1000  
    plt.imshow(L, cmap="gray")
    plt.show()
    

    转换为灰度图像方法2,点积:

    temp = np.array([ 0.299,  0.587, 0.114])
    plt.imshow(img@temp, cmap="gray")
    plt.show()
    

    2. 转置

    plt.imshow(L.T, cmap="gray")
    plt.show()
    

    3. 画出三个通道的彩图

    B_img = img.copy()
    B_img[:,:, [0,1]]=0
    
    R_img = img.copy()
    R_img[:,:, [0,2]]=0
    
    G_img = img.copy()
    G_img[:,:, [2,1]]=0
    
    
    fig,ax = plt.subplots(2,2)
    
    ax[0,0].imshow(img)
    ax[1,1].imshow(R_img)
    ax[1,0].imshow(G_img)
    ax[0,1].imshow(B_img)
    fig.set_size_inches(15, 15)
    plt.tight_layout()
    plt.show()
    

    4. 图像扩展

    t1 = np.concatenate((img, img, img), axis=1) # 横向拼接
    t2 = np.concatenate((t1, t1), axis=0)
    
    plt.imshow(t2)
    plt.show()
    

    5. 水平镜像 --- 交换行

    mirrow_img_x = img[::-1]
    plt.imshow(mirrow_img_x)
    plt.show()
    

    6. 水平翻转 --- 交换列

    mirrow_img_y = img[:,::-1]
    plt.imshow(mirrow_img_y)
    plt.show()
    

    7. 调换x,y坐标

    plt.imshow(img.transpose(1,0,2))
    plt.show()
    

    plt.imshow(img.transpose(1,0,2)[::-1])
    plt.show()
    

    8. 添加mask

    k = np.random.randint(0, 256, size=(200, 200, 3), dtype=np.uint8)
    test = img.copy()
    test[300:500,400:600] = k
    plt.imshow(test)
    plt.show()
    

    9. 随机打乱顺序

    t = img.copy()
    height=t.shape[0]
    
    li = np.split(t, range(100, height, 30), axis=0)
    np.random.shuffle(li)
    t = np.concatenate(li, axis=0)
    plt.imshow(t)
    plt.show()
    

    10. 交换通道

    t = img.copy()
    
    plt.imshow(t[:,:,[2,0,1]])
    plt.show()
    

    test = img[:, :, [2,1,0]]
    plt.imshow(test)
    plt.show()
    

  • 相关阅读:
    异常解决:swagger2.9.2 报java.lang.NumberFormatException: For input string: ““...
    SpringBoot中使用热部署插件
    SpringBoot中使用自定义拦截器
    SpringBoot开发的接口实现RESTFull的设计风格
    SpringBoot中使用jsp页面的方法
    SpringBoot的自定义配置方法二,通过@Value注解
    SpringBoot的自定义配置方法一,通过自定义配置文件
    Eclipse中使用Mybatis Generator自动生成POJO类、mapper类等
    Eclipse中将Maven工程转成SpringBoot工程
    相对高效的遍历Map的方法,其他方法效率相对较低
  • 原文地址:https://www.cnblogs.com/geoffreyone/p/9897902.html
Copyright © 2020-2023  润新知