Python视觉识别--OpenCVNumpy数组操作\图像通道的拆分与合并\画直线与矩形(三)

(四)Numpy数组操作

一个用python实现的科学计算包。
包括:
1、一个强大的N维数组对象Array;
2、比较成熟的(广播)函数库;
3、用于整合C/C++和Fortran代码的工具包;
4、实用的线性代数、傅里叶变换和随机数生成函数。
numpy和稀疏矩阵运算包scipy配合使用更加方便。
NumPy(Numeric Python)提供了许多高级的数值编程工具,如:矩阵数据类型、矢量处理,以及精密的运算库。专为进行严格的数字处理而产生。多为很多大型金融公司使用,以及核心的科学计算组织如:Lawrence Livermore,NASA用其处理一些本来使用C++,Fortran等所做的任务。

# -*- coding: UTF8 -*-

import cv2 as cv
import numpy as np

def access_pixel(image):
    """访问图像所有的像素"""
    print(image.shape)

    # 获取图像的高度,图像的高度为shape的第一个值(维度)
    height = image.shape[0]
    # 获取图像的宽读,图像的宽度为shape的第二个值(维度)
    width = image.shape[1]
    # 获取图像通道数目,图像的通道数目为shape的第三个值(维度)
    # 加载进来的图像都有三个通道,三个通道是图像的RGB
    channels = image.shape[2]
    print("宽: %s,高: %s 通道: %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
    # 循环可用以下取反法代替
    image=cv.bitwise_not(image)
    # 输出的是一个呈现负片效果的图片
    cv.imshow("pixels image".encode("gbk").decode(errors="ignore"), image)


def create_image():
    """创建新图象"""
    # 创建一张宽高都是400像素的3通道 8位图片
    img = np.zeros([400, 400, 3], np.uint8)
    # 修改通道值
    img[:, :, 0] = np.ones([400, 400]) * 255
    img[:, :, 2] = np.ones([400, 400]) * 255
    cv.imshow("new image".encode("gbk").decode(errors="ignore"), img)

    # 创建一个单通道的8位图片
    img = np.zeros([400, 400, 1], np.uint8)
    img = img * 127
    cv.imshow("single new image".encode("gbk").decode(errors="ignore"), img)
    cv.imwrite("images//new.jpg", img)

    # numpy 数组维度的变换
    # 定义一个二维数组
    img = np.ones([3, 3], np.uint8)
    # 填充每个元素
    img.fill(1000.22)
    print(img)
    # 变换为一维数组
    img = img.reshape([1, 9])
    print(img)


# 读入图片文件
src = cv.imread('images//test.jpg')

# 获取cpu当前时钟总数
t1 = cv.getTickCount()
access_pixel(src)
t2 = cv.getTickCount()
# 计算处理像素花费的时间
# cv.getTickFrequency() 每秒的时钟总数
time = ((t2 - t1) / cv.getTickFrequency())
print("花费时间: %s s" % time)
create_image()
# 等待用户操作
cv.waitKey(0)
# 释放所有窗口
cv.destroyAllWindows()

image.png

(五)图像通道的拆分与合并

拆分

# -*- coding: UTF8 -*-
import cv2
import os

# 读入图片,默认为BGR顺序,读出的变量img类型为uint8, size为(height,width,3)
img = cv2.imread(os.path.join('c:\\', 'test' + '.jpg'))

b,g,r = cv2.split(img)
print(b)
print(g)
print(r)
#或者是
# b = cv2.split(img)[0]
# g = cv2.split(img)[1]
# r = cv2.split(img)[2]
image.png

合并

# -*- coding: UTF8 -*-
import cv2
import os

# 读入图片,默认为BGR顺序,读出的变量img类型为uint8, size为(height,width,3)
img = cv2.imread(os.path.join('c:\\', 'test' + '.jpg'))

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

#合并,改变bgr,可显示不同的效果
img_merge = cv2.merge((b,g,r))

#显示图片,“图片”为图像窗口名称,img为图像变量,后面要加一句waitKey()
cv2.imshow("图片".encode("gbk").decode(errors="ignore"), img_merge)
cv2.waitKey()
cv2.destroyAllWindows()
image.png

合并,改变bgr,可显示不同的效果

img_merge = cv2.merge((g,b,r))


image.png

(六)画直线与矩形

# -*- coding: UTF8 -*-
import cv2
import os

# 读入图片,默认为BGR顺序,读出的变量img类型为uint8, size为(height,width,3)
img = cv2.imread(os.path.join('c:\\', 'test' + '.jpg'))
#画直线, 第二三个参数指的是直线的起始点,点坐标第一个值是列值,第二个是行值,第三个参数是颜色,顺序bgr,下面的是红色,最后一个参数是宽度
cv2.line(img,(10,2),(300,30),(0,0,255),2)
#画矩形,第二三个参数指的是矩形左上角点和右下角点,点坐标第一个值是列值,第二个是行值,第三个参数是颜色,顺序bgr,下面的是蓝色,最后一个参数是宽度
cv2.rectangle(img,(10,3),(200,80),(255,0,0),2)
#显示出来
cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()
image.png

(六) 读取图像最大值,和最大值索引

# -*- coding: UTF8 -*-
import cv2
import os

# 读入图片,默认为BGR顺序,读出的变量img类型为uint8, size为(height,width,3)
img = cv2.imread(os.path.join('c:\\', 'test' + '.jpg'))

img_b = img[:,:,0] #img_b 大小为(height,width)
print(img_b)
aa = img_b.max(0) # 按列取最大值,大小为(width,),每个值代表每一列的最大像素值
print(aa)
#aa[:, np.newaxis]可把大小由(width,)变为(width,1)
bb = img_b.argmax(0) # 按列取最大值所在位置,大小为(width,),每个值代表每一列的最大像素值所在的位置
print(bb)
cc = img_b.max(1) # 按行取最大值,大小为(height,),每个值代表每一行的最大像素值
print(cc)
dd = img_b.argmax(1) # 按行取最大值所在位置,大小为(height,),每个值代表每一行的最大像素值所在的位置
print(dd)
max=img.max() #取三通道中最大的像素值,是一个数值
print(max)
colMax=img.max(0) #按列取每个通道的最大值,大小为(width,3)
print(colMax)
rowMax=img.max(1) #按行取每个通道的最大值,大小为(height,3)
print(rowMax)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容