【OpenCV入门】第二部分——Numpy模块

这篇具有很好参考价值的文章主要介绍了【OpenCV入门】第二部分——Numpy模块。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在前面: 这个部分是Numpy模块与OpenCV有关的部分。如果想了解Numpy库是什么,或者想要直接单独学习Numpy库,可以看看我以前写的这篇Numpy学习笔记。一些内容如数组类型、数组创建、数组运算和数组索引在链接文章里有,就不在这里赘述了。

创建图像

在OpenCV中,黑白图像实际上就是一个二维数组,彩色图像是一个三维数组,数组中每个元素就是图像对应位置的像素值。因此,修改图像像素的操作实际上就是修改数组的操作。

  • 数组行索引 = 像素所在行数 - 1 = 像素纵坐标
  • 数组列索引 = 像素所在行数 - 1 = 像素横坐标

创建黑白图像

在黑白图像中,像素值为0表示黑色,像素值为255表示白色。

实例1: 创建纯黑色图像
创建一个100行、200列(即宽200、高100)的数组,数组元素格式为无符号8位整数,用0填充整个数组,将该数组当作图像显示出来,查看显示的结果。

import cv2
import numpy as np

width = 200
height = 100

img = np.zeros((height, width), np.uint8)
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉
创建纯白图像有两种方式:第一种是线创建纯黑图像,然后将图像中所有的像素值改为255;第二种使用NumPy提供的ones()方法创建一个像素值均为1的数组,然后让数组乘以255,同样可以得到一个纯白色的图像。

实例2: 创建纯白色图像
创建一个100行、200列(即宽200、高100)的数组,数组元素格式为无符号8位整数,用1填充整个数组,然后让数组乘以255,最后将该数组当作图像显示出来,查看显示的结果。

import cv2
import numpy as np

width = 200
height = 100

img = np.ones((height, width), np.uint8)*255
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉

通过切片式索引操作可以修改图像中指定区域内的像素,以达到修改图像内容的效果。

实例3: 在黑色图像内部绘制白色矩形
先绘制纯黑色图像作为背景,然后使用切片式索引将图像中横坐标为50 ~ 100、纵坐标为25 ~ 75的矩形区域颜色改为纯白色。

import cv2
import numpy as np

width = 200
height = 100

img = np.zeros((height, width), np.uint8)  # 创建指定宽高、单通道,像素值都为0的图像
img[25:75, 50:100] = 255  # 图像纵坐标为25~75,横坐标为50~100之间的区域变成白色
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉

实例4: 创建黑白相间的图像
先绘制纯黑色图像作为背景,然后在循环中使用切片式索引操作绘制成黑白间隔图像。

import cv2
import numpy as np

width = 200
height = 100

img = np.zeros((height, width), np.uint8)  # 创建指定宽高、单通道,像素值都为0的图像
for i in range(0, width, 40):
    img[:, i:i + 20] = 255
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉

创建彩色图像

显示颜色需要引入光谱三基色的概念,无法用二维数组表示,而是用到三维数组。OpenCV中华彩色图像默认为BGR格式,彩色图像的第三个索引表示的就是蓝、绿、红这三个颜色的颜色分量。

实例5: 创建彩色图像
创建彩色图像数组是将数组创建成三维数组,元素类型仍然为无符号8位整数。创建好表示纯黑色图像的三维数组后,复制出三个副本,三个副本分别修改最后一个索引代表的元素值。根据BGR的顺序,索引0表示蓝色分量,索引1表示绿色分量,索引2表示红色分量,让三个副本分别显示纯蓝色、纯绿色和纯红色。

import cv2
import numpy as np

width = 200
height = 100

img = np.zeros((height, width, 3), np.uint8)  # 创建指定宽高、3通道,像素值都为0的图像
blue = img.copy()
blue[:, :, 0] = 255  # 1通道所有像素都为255
green = img.copy()
green[:, :, 1] = 255  # 2通道所有像素都为255
red = img.copy()
red[:, :, 2] = 255  # 3通道所有像素都为255
cv2.imshow("blue", blue)
cv2.imshow("green", green)
cv2.imshow("red", red)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉

创建随机图像

随机图像是指图像中每一个像素值都是随机生成的,因为像素之间不会组成有效的视觉信息,所以这样的图像看上去就像杂乱无章的沙子。虽然随机图像没有任何视觉信息,但对于图像处理技术仍然很重要,毫无规律的像素数组称为干扰图像的噪声,或者当作图像加密的密钥。

实例6: 创建随机像素的雪花点图像
使用random.randint()方法就可以创建随机数组,将随机值的取值范围定在0 ~ 256之间(即像素值范围),元素类型定为无符号8位整数。

import cv2
import numpy as np

width = 200
height = 100

img = np.random.randint(256,size=(height,width),dtype=np.uint8) # 创建指定宽高、单通道、随机像素值的图像,随机值在0~256之间,数字为无符号8位整数
cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉
如果改成:

img = np.random.randint(256,size=(height,width,3),dtype=np.uint8) # 创建指定宽高、3通道、随机像素值的图

结果如下:
【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉

拼接图像

水平拼接数组

hstack()方法可以对数组进行水平拼接(或叫横向拼接)

array = numpy.hstack(tup)
  • tup: 要拼接的数组元组
  • array: 将参数元组中的数组水平拼接后生成的新数组

hstack()方法可以拼接多个数组,拼接效果如下所示。被拼接的数组必须在每一个维度都具有相同的长度,也就是数组“形状相同”。
【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉
例如,创建三个一维数组,将这三个数组进行水平拼接:

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.array([7,8,9])
result = np.hstack((a,b,c))
print(result)

结果如下:
【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉

垂直拼接数组

vstack()方法可以对数组进行垂直拼接(或叫纵向拼接)

array = numpy.vstack(tup)
  • tup: 要拼接的数组元组
  • array: 将参数元组中的数组垂直拼接后生成的新数组

【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉

例如,创建三个一维数组,将这三个数组进行垂直拼接:

import numpy as np
a = np.array([1,2,3])
b = np.array([4,5,6])
c = np.array([7,8,9])
result = np.vstack((a,b,c))
print(result)

结果如下:
【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉

在图像处理中的应用

在OpenCV中,图像就是一个二维或三维的像素数组,这些数组同样可以被NumPy拼接。

实例7: 按照水平和垂直两种方式拼接两个图像

import cv2
import numpy as np

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

img_h = np.hstack((img, img))
img_v = np.vstack((img, img))

cv2.imshow("img_h", img_h)
cv2.imshow("img_v", img_v)
cv2.waitKey()
cv2.destroyAllWindows()

结果如下:
【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉
【OpenCV入门】第二部分——Numpy模块,OpenCV,opencv,numpy,人工智能,算法,计算机视觉文章来源地址https://www.toymoban.com/news/detail-683365.html

到了这里,关于【OpenCV入门】第二部分——Numpy模块的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Python】【OpenCV】【NumPy】图像数据的访问

    接上一随笔,这次学习针对图像数据的访问(Numpy.array) 在OpenCV中,使用 imread() 方法可以访问图像,其返回值是一个数组,而根据传入的不同图像,将会返回不同维度的数组。 针对返回的图像数据,即数组,我们是可以进行操作的: 此时,我们就将MyPic这张图的(0, 0)这

    2024年02月05日
    浏览(31)
  • 【Python】【OpenCV】【NumPy】图像和原始字节的转换

    学习完基础的图像算法,开始接触OpenCV学习: 灰度图中,一个像素点上的灰度级需要一个字节(byte,2^8,8 bit)进行存储,此时的灰度图是二维的。 而当我们需要转换为彩色图时,即三维,便会产生颜色通道(Channel),这个时候,一个像素点上的灰度级便会需要三个字节来

    2024年02月05日
    浏览(24)
  • opencv-06 使用numpy.array 操作图片像素值

    numpy.array 提供了 item()和 itemset()函数 来访问和修改像素值,而且这两个函数都是经过 优化处理的,能够更大幅度地提高处理效率。在访问及修改像素点的值时,利用 numpy.array 提供的函数比直接使用索引要快得多,同时,这两个函数的可读性也更好。 可以将二值图像理解为特

    2024年02月16日
    浏览(33)
  • PIL、OpenCV、numpy处理图像格式的相互转化方式

    OpenCV读取图像后返回的是一个代表图像的NumPy数组,采用的格式是 H×W×C,通道顺序为BGR 使用matplotlib绘图时,可以读取tesnor和numpy数据类型,图片通道顺序为RGB,且尺寸为(H,W,C)。 使用np.array(image)和np.asarray(image)可以将 PIL Image 图像转换成 numpy 数组。 使用Image.fromarray(np.uint8(i

    2024年02月07日
    浏览(37)
  • ctypes实现numpy和OpenCV Mat之间的数据交互

    将c/c++编译成动态链接库,通过python调用,实现常见变量比如int,字符串之间的交互,以及np.ndarray和cv::Mat间的交互. 更简单的方式参考:pybind11实现numpy和OpenCV Mat的数据交互-CSDN博客 新建CMakeLists.txt,如下,需要安装opencv,安装教程参考Ubuntu 18.04 安装opencv4.2.0,如果遇到IPPIC

    2024年01月20日
    浏览(35)
  • python numpy opencv调整图片亮度对比度饱和度

    (想要完整代码直接划到最后) 原理比较简单,本质上是对图像各个通道的每个像素点做线性变换,对超出范围[0,255]的做截断处理,所以使用numpy处理比较方便 一下函数为了

    2024年02月12日
    浏览(30)
  • 解决opencv出错:ImportError: numpy.core.multiarray failed to import

    利用安装好opencv后,导入cv2的时候报错,如下 这里是numpy库的版本过低或者过高,不合适刚刚装的opencv版本。 尝试升高或降低numpy版本,一般是升级到高版本 但也不要太高,需要兼容自己的python版本

    2024年02月01日
    浏览(28)
  • 16bit深度图保存方式:opencv png格式和numpy npy格式对比

    通过激光雷达或深度估计得到的深度图一般为float32或float64类型数据,具有超大量数据,保存为常见的jpg格式图像(uint8:80-255)时则会损失数据精度,如果保存为.npy文件时则文件大小过大(eg:1280*1920大小的深度数组保存后所占空间为37.5Mb),因此需要处理下数据再进行保存

    2024年02月12日
    浏览(34)
  • anaconda 安装matplotlib 、PIL 、opencv、numpy、mediapipe、skimage、torch torchvision torchaudio、imutils、onnx

    【安装matplotlib】 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple matplotlib==3.5.2 【安装PIL】(如果已经安装了matplotlib,则无需单独安装) pip install pillow 【安装opencv】 pip install -i https://mirrors.aliyun.com/pypi/simple/ opencv-python==3.4.11.45 pip install -i https://mirrors.aliyun.com/pypi/simple/ opencv-contrib-

    2024年01月24日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包