zoukankan      html  css  js  c++  java
  • python 图像处理 (2):图像像素的访问与裁剪

    图片读入程序中后,是以numpy数组存在的。因此对numpy数组的一切功能,对图片也适用。对数组元素的访问,实际上就是对图片像素点的访问。

    彩色图片访问方式为:

    img[i,j,c]

    i表示图片的行数,j表示图片的列数,c表示图片的通道数(RGB三通道分别对应0,1,2)。坐标是从左上角开始。

    灰度图片访问方式为:

    gray[i,j]

    例1:输出小猫图片的G通道中的第20行30列的像素值

    from skimage import io,data
    img=data.chelsea()
    pixel=img[20,30,1]
    print(pixel)

    输出为129

    例2:显示红色单通道图片

    from skimage import io,data
    img=data.chelsea()
    R=img[:,:,0]
    io.imshow(R)

    除了对像素进行读取,也可以修改像素值。

    例3:对小猫图片随机添加椒盐噪声

    复制代码
    from skimage import io,data
    import numpy as np
    img=data.chelsea()
    
    #随机生成5000个椒盐
    rows,cols,dims=img.shape
    for i in range(5000):
        x=np.random.randint(0,rows)
        y=np.random.randint(0,cols)
        img[x,y,:]=255
        
    io.imshow(img)
    复制代码

    这里用到了numpy包里的random来生成随机数,randint(0,cols)表示随机生成一个整数,范围在0到cols之间。

    用img[x,y,:]=255这句来对像素值进行修改,将原来的三通道像素值,变为255

    通过对数组的裁剪,就可以实现对图片的裁剪。

    例4:对小猫图片进行裁剪

    from skimage import io,data
    img=data.chelsea()
    roi=img[80:180,100:200,:]
    io.imshow(roi)

    对多个像素点进行操作,使用数组切片方式访问。切片方式返回的是以指定间隔下标访问 该数组的像素值。下面是有关灰度图像的一些例子:

    复制代码
    img[i,:] = im[j,:] # 将第 j 行的数值赋值给第 i 行
    
    img[:,i] = 100 # 将第 i 列的所有数值设为 100
    
    img[:100,:50].sum() # 计算前 100 行、前 50 列所有数值的和
    
    img[50:100,50:100] # 50~100 行,50~100 列(不包括第 100 行和第 100 列)
    
    img[i].mean() # 第 i 行所有数值的平均值
    
    img[:,-1] # 最后一列
    
    img[-2,:] (or im[-2]) # 倒数第二行
    复制代码

    最后我们再看两个对像素值进行访问和改变的例子:

    例5:将lena图片进行二值化,像素值大于128的变为1,否则变为0

    复制代码
    from skimage import io,data,color
    img=data.lena()
    img_gray=color.rgb2gray(img)
    rows,cols=img_gray.shape
    for i in range(rows):
        for j in range(cols):
            if (img_gray[i,j]<=0.5):
                img_gray[i,j]=0
            else:
                img_gray[i,j]=1
    io.imshow(img_gray)
    复制代码

    这个例子,使用了color模块的rgb2gray()函数,将彩色三通道图片转换成灰度图。转换结果为float64类型的数组,范围为[0,1]之间。

     例6:

    from skimage import io,data
    img=data.chelsea()
    reddish = img[:, :, 0] >170
    img[reddish] = [0, 255, 0]
    io.imshow(img)

    这个例子先对R通道的所有像素值进行判断,如果大于170,则将这个地方的像素值变为[0,255,0], 即G通道值为255,R和B通道值为0。

  • 相关阅读:
    107. Binary Tree Level Order Traversal II
    103. Binary Tree Zigzag Level Order Traversal
    102. Binary Tree Level Order Traversal
    690. Employee Importance
    1723. Find Minimum Time to Finish All Jobs
    LeetCode 329 矩阵中最长增长路径
    7.2 物理内存管理
    LeetCode 面试题 特定深度节点链表
    LeetCode 100 相同的树
    npm安装包命令详解,dependencies与devDependencies实际区别
  • 原文地址:https://www.cnblogs.com/presleyren/p/14708425.html
Copyright © 2011-2022 走看看