【OpenCV】图像进行数字化操作:像素确定位置、获取像素BGR值、修改像素BGR值、修改指定区域内像素

【基础教程】
【OpenCV】在Python环境下安装OpenCV并检测是否安装成功
【OpenCV】Python OpenCV的基本图像处理操作:读取、显示、保存、获取属性

图像数字化是指用数字表示图像。每一幅数字图像都是由M行N列的像素组成的,其中每一个像素都存储一个像素值。计算机通常会把像素值处理为256个灰度级别,这256个灰度级别分别用区间[0,255]中的数值表示。其中,“0”表示纯黑色;“255”表示纯白色。

一、 像素

像素是构成数字图像的基本单位。当我们放大图像发现许多个小方块组成的,通常把一个小方块称作一个像素。因此,一个像素是具有一定面积的一个块,而不是一个点。需要注意的是,像素的形状是不固定的;大多数情况下,像素被认为是方形的,但有时也可能是圆形的或者是其他形状的。

1、确定像素的位置

图片是由许多像素组成,我们按照水平方向和垂直方向上进行建立向下的坐标系,通过坐标(x,y)的点位置确定像素的位置。
在这里插入图片描述
我们需要注意的一点是,坐标的起始位置都是从0开始,横轴的坐标范围为0~366也就是横轴的像素个数为367个,同理纵轴的像素范围0 ~ 199 那么像素个数为200个。

确定像素的位置:

import cv2

image = cv2.imread("./imgs/opencv.jpg")

# 打印彩色图像的(像素行数,像素列数,通道数)
print("shape =", image.shape)  # shape = (200, 367, 3)

# 获取坐标为(167,267)的像素
px = image[167,267]

这里需要注意一下,图像水平方向对应着像素的列数,而垂直方向对应着像素的行数,图像上我们确定像素位置坐标看作是(X,Y)而代码中输出的则是(Y,X)这个之间关系要区别。

2、获取像素的BGR值

我们先了解一下三基色的概念。人眼能够感知红色、绿色和蓝色这3种不同的颜色,因此把这3种颜色称作三基色。如果将这3种颜色以不同的比例进行混合,人眼就会感知到丰富多彩的颜色。
计算机利用色彩空间对颜色编码。也就是说色彩空间是计算机对颜色进行编码的模型。

以较为常用的RGB色彩空间为例,在RGB色彩空间中,存在3个通道,即R通道、G通道和B通道。其中,R通道指的是红色(Red)通道;G通道指的是绿色(Green〉通道;B通道指的是蓝色(Blue))通道;并且每个色彩通道都在区间[0,255]内进行取值。

通常使用一个三维数组来表示一幅图像中某一个像素的RGB值。

这里需要区分一下像素的BGR值与色彩空间RGB值的顺序是相反的。
RGB图像是指用RGB色彩空间显示的图像,BGR图像是指用BGR色彩空间显示的图像;RGB色彩空间和BGR色彩空间的区别是图像在RGB色彩空间中的通道顺序是R→G→B,在BGR的色彩空间中的通道顺序是B→G→R。

import cv2

image = cv2.imread("./imgs/opencv.jpg")

# 打印彩色图像的(像素行数,像素列数,通道数)
print("shape =", image.shape)  # shape = (200, 367, 3)

# 获取坐标为(167,267)的像素
px = image[167,267]

# 坐标(167,267)上的像素的BGR值是: [255 87 110]
print("坐标(167,267)上的像素的BGR值是:",px)

# 分别获取坐标(167,267)上像素的B通道、G通道和R通道的值。
blue = image[167,267,0]  #坐标(167,267)上的像素的B通道的值
green = image[167,267,1]  #坐标(167,267)上的像素的G通道的值
red = image[167,267,2]  #坐标(167,267)上的像素的R通道的值
print("(B,G,R):",(blue,green,red))  # (B,G,R): (255, 87, 110)

这里说明一点:我们先确定了像素的位置,每个像素其实是一个小方块。,
我们可以这样理解,一张图片是由一系列的像素组成的二维矩阵,而每一个像素则对应着BGR色彩空间中的BGR通道值,是一个三维数组。其实也就是,二维矩阵的每个元素都是三维数组。

3、修改像素的BGR值

import cv2

image = cv2.imread("./imgs/opencv.jpg")
print(image)

# 打印彩色图像的(像素行数,像素列数,通道数)
print("shape =", image.shape)  # shape = (200, 367, 3)

# 获取坐标为(167,267)的像素
px = image[167,267]

# 坐标(167,267)上的像素的BGR值是: [255 87 110]
print("坐标(167,267)上的像素的BGR值是:",px)

image[167,267] = [255,255,255]
#把坐标(291,218)上的像素的值修改为[255,255,255]
print("坐标(167,267)上的像素修改后的BGR值是",px)

cv2.imwrite("./imgs/my_save.jpg",image)

在这里插入图片描述

4、修改指定区域内的所有像素

import cv2

image = cv2.imread("./imgs/opencv.jpg")
cv2.imshow("opencv.jpg", image)

# 打印彩色图像的(像素行数,像素列数,通道数)
print("shape =", image.shape)  # shape = (200, 367, 3)

# 显示opencv.jpg
for i in range(150, 200):
    # i表示横坐标:像素行数
    for j in range(300, 367):
        # j表示纵坐标:像素列数
        image[i, j] = [255, 255, 255]  # 把区域内的所有像素都修改为白色

cv2.imshow("opencv_demo.jpg", image)  # 显示图opencv_demo.jpg

cv2.waitKey()
cv2.destroyAllwindows()  # 关闭所有的窗口时,销毁所有窗口

在这里插入图片描述

  • 14
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
OpenCV是一个开源的计算机视觉库,也常用于对手写数字图像进行预处理。下面将使用300字回答OpenCV对手写数字图像进行预处理的方法。 首先,加载手写数字图像。可以使用Python的OpenCV库中的imread()函数来读取图像文件。通过提供图像的路径作为参数,该函数将返回一个代表图像的多维数组。 接下来,将彩色图像转换为灰度图像。手写数字通常是黑色的,因此将图像转换为灰度图像可以使后续处理更容易。可以使用OpenCV的cvtColor()函数将图像BGR格式转换为灰度格式。 然后,进行化处理。二化是将图像转换为只有两个色调——黑色和白色。手写数字图像通常采用黑色背景和白色数字的形式,因此将图像进行化可以更好地提取数字的特征。可以使用OpenCV的threshold()函数来实现这一目标。 接下来,进行数字图像的轮廓提取。通过查找图像中的连续的白色区域,可以得到数字的轮廓。可以使用OpenCV的findContours()函数来查找和提取图像中的所有轮廓。 然后,进行数字图像的大小标准化。由于手写数字的大小和比例可能会有所不同,因此对图像进行大小标准化可以确保后续的识别和分类更加准确。可以使用OpenCV的resize()函数来将图像的大小调整为统一的尺寸。 最后,对图像进行特征提取。通过提取数字的形状、纹理或其他特征,可以更好地区分不同的数字。可以使用OpenCV的相关函数来提取和计算这些特征。 综上所述,OpenCV对手写数字图像进行预处理的一般步骤包括:加载图像、转换为灰度图像、二化处理、轮廓提取、大小标准化以及特征提取。这些步骤可以帮助我们更好地处理手写数字图像,使其适用于后续的数字识别和分类任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值