前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python3+OpenCV3图像处理(三)—— Numpy数组操作图片

Python3+OpenCV3图像处理(三)—— Numpy数组操作图片

作者头像
用户7886150
修改2021-01-05 10:26:47
5470
修改2021-01-05 10:26:47
举报
文章被收录于专栏:bit哲学院bit哲学院

参考链接: Python中的numpy.pv

一.改变图片每个像素点每个通道的灰度值 

(一) 

代码如下: 

#遍历访问图片每个像素点,并修改相应的RGB

import cv2 as cv

def access_pixels(image):

    print(image.shape)

    height = image.shape[0]

    width = image.shape[1]

    channels = image.shape[2]

    print("width: %s  height: %s  channels: %s"%(width, height, channels))

    for row in range(height):

        for col in range(width):

            for c in range(channels):

                pv = image[row , col, c]        #获取每个像素点的每个通道的数值

                image[row, col, c]=255 - pv     #灰度值是0-255   这里是修改每个像素点每个通道灰度值

    cv.imshow("second_image",image)

src=cv.imread('E:\imageload\example.png')   #blue, green, red

cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE)

cv.imshow('first_image', src)

t1 = cv.getTickCount()    #GetTickcount函数返回从操作系统启动到当前所经过的毫秒数

access_pixels(src)

t2 = cv.getTickCount()

time = (t2-t1)/cv.getTickFrequency()  #getTickFrequency函数返回CPU的频率,就是每秒的计时周期数

print("time : %s ms"%(time*1000) )    #输出运行时间

cv.waitKey(0)

cv.destroyAllWindows() 

运行结果: 

注意: 

1.image[i,j,c]   i表示图片的行数,j表示图片的列数,c表示图片的通道数(0代表B,1代表G,2代表R    一共是RGB三通道)。坐标是从左上角开始 

2.每个通道对应一个灰度值。灰度值概念:把白色与黑色之间按对数关系分成若干级,称为“灰度等级”。范围一般从0到255,白色为255,黑色为0。要详细了解灰度值和通道的概念,请参考这篇博客:https://blog.csdn.net/silence2015/article/details/53789748 

(二) 

上述代码实现像素取反的运行时间较长,下面代码运用opencv自带的库函数可以使运行时间大大减少。 

代码如下: 

#调用opencv的库函数快速实现像素取反

import cv2 as cv

def inverse(img):

    img = cv.bitwise_not(img)   #函数cv.bitwise_not可以实现像素点各通道值取反

    cv.imshow("second_image", img)

src=cv.imread('E:\imageload\example.png')   #blue, green, red

cv.namedWindow('first_image', cv.WINDOW_AUTOSIZE)

cv.imshow('first_image', src)

t1 = cv.getTickCount()    #GetTickcount函数返回从操作系统启动到当前所经过的毫秒数

inverse(src)

t2 = cv.getTickCount()

time = (t2-t1)/cv.getTickFrequency()  #getTickFrequency函数返回CPU的频率,就是每秒的计时周期数

print("time : %s ms"%(time*1000) )    #输出运行时间

cv.waitKey(0)

cv.destroyAllWindows() 

运行结果: 

可见,使用库函数 bitwise_not 可以使运行时间缩短13倍左右 

二.自定义一张三通道图片 

代码如下: 

#自定义一张三通道图片

import cv2 as cv

import numpy as np

def creat_image():

    img = np.zeros([400, 400, 3], np.uint8)   #将所有像素点的各通道数值赋0

    img[:, :, 0] = np.ones([400, 400]) * 255   #0通道代表B

    # img[:, :, 1] = np.ones([400, 400]) * 255   #1通道代表G

    # img[:, :, 2] = np.ones([400, 400]) * 255   #2通道代表R

    cv.imshow("new_image",img)

creat_image()

cv.waitKey(0)

cv.destroyAllWindows() 

运行结果: 

注意: 

1.np.zeros函数用于创建一个数值全为0的矩阵,np.ones用于创建一个数值全为1的矩阵 

2.当图片为多通道图片时,B:255  G:0  R:0 则三通道图片显示蓝色。所有通道数值组合示意图如下: 

补注: 

单通道: 此通道上值为0-255。 (255为白色,0是黑色) 只能表示灰度,不能表示彩色。 三通道:BGR (255,255,255为白色, 0,0,0是黑色 )  可以表示彩色, 灰度也是彩色的一种。 

单通道和三通道区别见博客:https://blog.csdn.net/qq_32211827/article/details/56854985 

三、自定义一张单通道图片 

代码如下: 

#自定义一张单通道图片

import cv2 as cv

import numpy as np

def creat_image():

    img = np.ones([400, 400, 1], np.uint8)   #该像素点只有一个通道,该函数使所有像素点的通道的灰度值为1

    img = img * 127       #使每个像素点单通道的灰度值变为127

    cv.imshow("new_image",img)

creat_image()

cv.waitKey(0)

cv.destroyAllWindows() 

运行结果: 

注意: 

1.代码里 img = img * 127    表示数组里的每个数值都乘以127 

2.之所以np.ones函数参数类型是uint8,是因为uint8数的范围为0~255,  那么为0时恰好为黑色,为255时恰好为白色。若函数参数类型为int8,则int8类型数的范围为-128~127,那么-128则为黑色,127为白色

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档