python图像处理opencv(图像像素访问,通道分离与合并)

 

 

 https://blog.csdn.net/Small_Mouse0/article/details/54020357

python可以调用opencv中提供的诸多方法来完成,对图像像素访问,RGB等通道的分离与合并

一. 像素访问
opencv中使用 imread读出来的图片直接可以通过 im[i,j,0] 访问i,j位置的R通道(默认是RGB)
代码示例:

#访问像素点,生成模拟带有小孔图片

import cv2
import numpy as np


def salt(img, n):
    for k in range(n):
        i = int(np.random.random() * img.shape[1])
        j = int(np.random.random() * img.shape[0])
        if img.ndim == 2:
            img[j,i] = 255
        elif img.ndim == 3:
            img[j,i,0]= 0
            img[j,i,1]= 0
            img[j,i,2]= 0
    return img

if __name__ == '__main__':
    img = cv2.imread("test1.jpg")
    saltImage = salt(img, 1000)
    cv2.imshow("Salt", saltImage)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

为什么使用np.random.random()?
这里使用了numpy的随机数,Python自身也有一个随机数生成函数。这里只是一种习惯,
np.random模块中拥有更多的方法,而Python自带的random只是一个轻量级的模块。不
过需要注意的是np.random.seed()不是线程安全的,而Python自带的random.seed()是
线程安全的。如果使用随机数时需要用到多线程,建议使用Python自带的random()和
random.seed(),或者构建一个本地的np.random.Random类的实例。
出自:这里


二. 通道分离
三种方式:

1.使用OpenCV自带的split函数

b, g, r = cv2.split(img)

2.通过访问cv2.split(img)数组来分离

b = cv2.split(img)[0]
g = cv2.split(img)[1]
r = cv2.split(img)[2]

3.直接操作NumPy数组来完成分离
注意:需要先要开辟一个相同大小的图片出来。这是由于numpy中数组的复制有些需要注意的地方

b = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
g = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
r = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
b[:,:] = img[:,:,0]
g[:,:] = img[:,:,1]
r[:,:] = img[:,:,2]

三. 通道合并
使用opencv 提供的merge函数进行合并,
注意:顺序不是RGB而是 BGR,否则会不会是原图

#合并RGB(b,g,r  顺序没写对,不会合成原图)
merged = cv2.merge([b,g,r])
cv2.imshow("merged", merged)

测试完整代码:

#coding=utf-8
#
# 图像像素访问.通道分离与合并
#

'''
#访问像素点,模拟带有模拟椒盐现象的图片
import cv2
import numpy as np


def salt(img, n):
    for k in range(n):
        i = int(np.random.random() * img.shape[1])
        j = int(np.random.random() * img.shape[0])
        if img.ndim == 2:
            img[j,i] = 255
        elif img.ndim == 3:
            img[j,i,0]= 255
            img[j,i,1]= 255
            img[j,i,2]= 255
    return img

if __name__ == '__main__':
    img = cv2.imread("test1.jpg")
    saltImage = salt(img, 1000)
    cv2.imshow("Salt", saltImage)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
'''

import cv2
import numpy as np

img = cv2.imread("test1.jpg")

#分离方法1:使用OpenCV自带的split函数
b, g, r = cv2.split(img)

#分离方法2:通过访问cv2.split(img)数组来分离
#b = cv2.split(img)[0]
#g = cv2.split(img)[1]
#r = cv2.split(img)[2]

'''
分离方法3:直接操作NumPy数组来完成分离
注意:需要先要开辟一个相同大小的图片出来。这是由于numpy中数组的复制有些需要注意的地方
b = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
g = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
r = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
b[:,:] = img[:,:,0]
g[:,:] = img[:,:,1]
r[:,:] = img[:,:,2]
'''

cv2.imshow("Blue", r)
cv2.imshow("Red", g)
cv2.imshow("Green", b)
#合并RGB(b,g,r  顺序没写对,不会合成原图)
merged = cv2.merge([b,g,r])
cv2.imshow("merged", merged)
cv2.waitKey(0)
cv2.destroyAllWindows()

参考博客:
http://blog.csdn.net/sunny2038/article/details/9080047

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

猜你喜欢

转载自blog.csdn.net/qq_36955294/article/details/82765282