python OpenCV 图像像素访问 (三)

访问图像像素

#!/usr/bin/env python  
# encoding: utf-8  

import numpy as np
import cv2

#像素的访问和访问numpy中ndarray的方法完全一样
img[j,i] = 255  # 灰度图访问;j,i 分别表示图像的行和列

#BGR 图像访问
img[j,i,0] = 255   # 0 -- 为通道,指B通道
img[j,i,1] = 255   # 1 -- 为通道,指G通道
img[j,i,2] = 255   # 2 -- 为通道,指R通道

完整示例(给图像加上白色点点):

#!/usr/bin/env python  
# encoding: utf-8  

import cv2  
import numpy as np  
  
def salt(img, n):  
    for k in range(n):  
        #img.shape[0] -- 取得img 的列(图片的高) 
        #img.shape[1] -- 取得img 的行(图片的宽) 
        i = int(np.random.random() * img.shape[1]);  
        j = int(np.random.random() * img.shape[0]); 

        #判断是否为2维数组(即为灰度图像)
        if img.ndim == 2:   
            img[j,i] = 255  #设置值为白点
        
        elif img.ndim == 3:   #判断是否为3维数组(即为RGB图像)
            img[j,i,0]= 255  
            img[j,i,1]= 255  
            img[j,i,2]= 255  
    return img  
  
if __name__ == '__main__':  
    img = cv2.imread("mini.jpg")  
    saltImage = salt(img, 500)  
    
    cv2.imshow("Salt", saltImage)  
    cv2.waitKey(0)  
    cv2.destroyAllWindows()


几点注意说明:

  1. 与c++ 版的opencv 不同,在Python 中灰度图的 img.ndim = 2 ,而 c++ 中灰度图图像的通道数 img.channel() = 1

  2. 关于使用np.random.random()

      这里使用了 Numpy 的随机数,Python自带也有一个随机数。np.random模块中拥有更多的方法,而Python 自带的random只是一个轻量级的模块。

      要注意的是np.random.seed() 不是线程安全的,而Python 自带的random.seed() 是线程安全的。如果使用随机数时需要用到多线程,建议使用Python

      自带的random() 和 random.seed() ,或者构建一个本地的np.random.Random 类的实例


参考和转载地址:

http://blog.csdn.net/sunny2038/article/details/9080047









评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值