(四)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)