首页 > 其他分享 >cv2 像素

cv2 像素

时间:2023-12-15 22:23:14浏览次数:25  
标签:cv2 218 像素 RGB 坐标 255 291

像素是构成数字图像的基本单位。现有一幅显示花朵的图像(如图1所示),提取并放大图1中被蓝色圆环圈住的区域,将得到一幅如图2所示的图像。

图1  一幅显示花朵的图像

图2  提取并放大图1中被蓝色圆环圈住的区域

不难发现,图2所示的图像是由许多个小方块组成的,通常把一个小方块称作一个像素。因此,一个像素是具有一定面积的一个块,而不是一个点。需要注意的是,像素的形状是不固定的;大多数情况下,像素被认为是方形的,但有时也可能是圆形的或者是其他形状的。

1  确定像素的位置

以图1为例,在访问图1中的某个像素之前,要确定这个像素在图1中的位置。那么,这个位置应该如何确定呢?

首先,确定图1在水平方向上和垂直方向上的像素个数。图1的“水平方向”和“垂直方向”如图3所示。

图3  图1的“水平方向”和“垂直方向”

在Windows 10系统的“画图”工具中打开图1,将得到如图4所示的界面。在这个界面中,就会得到图1在水平方向上的像素个数是219个,在垂直方向上的像素个数是292个。

 

图4  把图2在“画图”工具中打开

然后,根据图1中在水平方向上和垂直方向上的像素个数,绘制如图5所示的坐标系。

图5  根据图2.1在水平方向和垂直方向上的像素个数绘制坐标系

说明:图1在水平方向上的像素个数是219个,与其对应的是x轴的取值范围,即0~218;同理,图1在垂直方向上的像素个数是292个,与其对应的是y轴的取值范围,即0~291。

这样,就能够通过坐标来确定某个像素在图1中的位置。在OpenCV中,正确表示图1中某个像素坐标的方式是(y, x)。例如,在如图5所示的坐标系中,图1右下角的像素坐标是(291, 218)。

实例1  表示图1中的指定像素

编写一段代码,先读取D盘根目录下的2.1.jpg,再表示坐标(291, 218)上的像素。代码如下:

import cv2

 

image = cv2.imread("D:/2.1.jpg") # 读取D盘根目录下的2.1.jpg

px = image[291, 218] # 坐标(291, 218)上的像素

2  获取像素的BGR值

前面已经得到了坐标为(291, 218)上的像素px。现使用print()方法打印这个像素,将得到这个像素的RGB值。代码如下:

print("坐标(291, 218)上的像素的RGB值是", px)

上述代码的运行结果如下:

坐标(291, 218)上的像素的RGB值是 [36 42 49]

不难发现,坐标(291, 218)上的像素的RGB值是由36、42和49这3个数值组成的。在讲解这3个数值各自代表的含义之前,先了解下什么是三基色。

如图6所示,人眼能够感知红色、绿色和蓝色这3种不同的颜色,因此把这3种颜色称作三基色。如果将这3种颜色以不同的比例进行混合,人眼就会感知到丰富多彩的颜色。

图6  三基色

那么,对于计算机而言,是如何对这些颜色进行编码的呢?答案就是利用色彩空间。也就是说,色彩空间是计算机对颜色进行编码的模型。

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

这样,计算机将会利用这3个色彩通道的不同组合来表示不同的颜色。如图7所示,通过截图工具,能够得到坐标(291, 218)上的像素的RGB值为(49, 42, 36)。

图7  坐标为(291, 218)上的像素的RGB值

说明:通常使用一个三维数组来表示一幅图像中某一个像素的RGB值。例如,图1中坐标(291, 218)上的像素的RGB值为(49, 42, 36)。

使用print()方法打印图1中坐标(291, 218)上的像素px,其结果是(36, 42, 49)。而图7中这个坐标上的像素的RGB值为(49, 42, 36)。这时会发现这两个结果中的数值是相同的,但顺序是相反的,这是为什么呢?

原因是OpenCV对图像的通道顺序进行了转换,即把RGB图像的通道顺序由R(49)→G(42)→B(36)转换为BGR图像的通道顺序,即B(36)→G(42)→R(36)。

说明:RGB图像是指用RGB色彩空间显示的图像,BGR图像是指用BGR色彩空间显示的图像;RGB色彩空间和BGR色彩空间的区别是图像在RGB色彩空间中的通道顺序是R→G→B,在BGR的色彩空间中的通道顺序是B→G→R。

在OpenCV中,获取坐标(291, 218)上的像素px的BGR值有如下两种方式:

(1)同时获取坐标(291, 218)上的像素的B通道、G通道和R通道的值。代码如下:

import cv2

 

image = cv2.imread("D:/2.1.jpg")

px = image[291, 218] # 坐标(291, 218)上的像素

print(px)

上述代码的运行结果如下:

[36 42 49]

(2)分别获取坐标(291, 218)上的像素的B通道、G通道和R通道的值。代码如下:

import cv2

 

image = cv2.imread("D:/2.1.jpg")

blue = image[291, 218, 0] # 坐标(291, 218)上的像素的B通道的值

green = image[291, 218, 1] # 坐标(291, 218)上的像素的G通道的值

red = image[291, 218, 2] # 坐标(291, 218)上的像素的R通道的值

print(blue, green, red)

上述代码的运行结果如下:

36 42 49

说明:(1)image[291, 218, 0]中的最后一个数值0表示B通道;

        (2)image[291, 218, 1]中的最后一个数值1表示G通道;

        (3)image[291, 218, 2]中的最后一个数值2表示R通道。

3  修改像素的BGR值

已经获取了图1中坐标(291, 218)上的像素px的BGR值,即(36, 42, 49)。现要将像素px的BGR值由原来的(36, 42, 49)修改(255, 255, 255),代码如下:

import cv2

 

image = cv2.imread("D:/2.1.jpg")

px = image[291, 218]

print("坐标(291, 218)上的像素的初始RGB值是", px)

px = [255, 255, 255] # 把坐标(291, 218)上的像素的值修改为[255, 255, 255]

print("坐标(291, 218)上的像素修改后的RGB值是", px)

上述代码的运行结果如下:

坐标(291, 218)上的像素的初始RGB值是 [36 42 49]

坐标(291, 218)上的像素修改后的RGB值是 [255, 255, 255]

说明:对于RGB/BGR图像,当每个像素的R、G、B这3个数值相等时,就可以得到灰度图像。其中,R = G = B = 0(B = G = R = 0)为纯黑色;R = G = B = 255(B = G = R = 255)为纯白色。

实例2  修改图1中的指定区域内的所有像素

编写一个程序,将图1中的坐标(241, 168)、(241, 218)、(291, 168)和(291, 218)这4个点所围成的区域内的所有像素都修改为纯白色。代码如下:

import cv2

 

image = cv2.imread("D:/2.1.jpg")

cv2.imshow("2.1", image) # 显示图1

for i in range(241, 292): # i表示横坐标,在区间[241, 291]内取值

    for j in range(168, 219): # j表示纵坐标,在区间[168, 218]内取值

        image[i, j] = [255, 255, 255] # 把区域内的所有像素都修改为白色

cv2.imshow("2.8", image) # 显示图8

cv2.waitKey()

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

上述代码的运行结果如图8所示(左侧的图片是原图)。

图8  把指定区域内的所有像素都修改为白色

标签:cv2,218,像素,RGB,坐标,255,291
From: https://www.cnblogs.com/flyingsir/p/17904281.html

相关文章

  • 像素格式转换
    使用ffmpeg,sws_scale接口做像素格式转换参考雷神:https://blog.csdn.net/leixiaohua1020/article/details/42134965**主要功能:**转换像素格式转换后的数据填充到AVFrame中#include<stdio.h>#include<unistd.h>#include<fstream>#include<iostream>/***最......
  • python cv2.imread 读取中文路径的图片返回为None的问题
    使用cv2读取图片时,输出图片形状大小时出现报错“'NoneType'objecthasnoattributeshape”,后来排查发现读取图片的返回值image为None,这就说明图片根本就没有被读取。下面图片是问题问题解决后,为了更好的展示,写的代码展示,这是正常的因果关系,找错误排查时是从下往上推。 ......
  • ue 切换像素流分辨率
    参考文档https://docs.unrealengine.com/4.27/zh-CN/SharingAndReleasing/PixelStreaming/PixelStreamingIntro/https://docs.unrealengine.com/5.0/zh-CN/unreal-engine-pixel-streaming-reference/准备工作信令服务和前端可以先把信令服务起起来,如至于前端的话,参考:htt......
  • 百分号、像素与数值的转换与像素区别
    vue百分值与数值之间转换方法一:lettopValue=Number(this.optionModel.grid[i].top);是尝试把整个字符串转换为数字,包括百分号。如果字符串不能被解析为有效的数字,那么结果将是NaN,在这种情况下,你可能需要添加错误处理代码来处理这种情况如果是40%值的话可以转成0.4......
  • 极语言3-11像素格式类、调色类、色度类、位图数据类、变色类、路径点类——成员表
    中文名字英文名称长度作用解释像素格式类PIXELFORMATDESCRIPTOR46包含了逻辑字体信息的结构像素格式类——成员表长度nSize整形结构的大小版本nVersion整形结构的版本,一般设为1标志dwFlags整数表明像素缓冲特性的标志位,如缓冲是否支持GDI或OpenGL等索引iPixelType整数说明象素数据......
  • matlab在图像中随机更改像素值程序
    I=imread('C:\Users\wangd\Desktop\result3.png');%m=rgb2gray(I);%r=unidrnd(255,1,100);%产生一个1*100的数组,数组中的值为1至255中的随机值%r1=randi([2,7],10,100);%在开区间(2,7)生成10*100型随机矩阵subplot(2,2,1);imshow(I);title('原始图像');forw=1:......
  • python的cv2模块使用
    一.安装CV2(opencv)模块pipinstallopencv-python二.使用imread读取图片使用函数cv2.imread(filepath,flags)读入一副图片filepath:要读入图片的完整路径flags:读入图片的标志cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道。alpha通道代表透明度效果,取值......
  • 从像素到认知:图像识别的技术与应用全景
    从像素到认知:图像识别的技术与应用全景图像识别,这个看似熟悉的概念,实则蕴含着深远的科技历史和丰富的技术内涵。它不仅关乎像素的运算和组合,更是人类对世界认知的深入理解和抽象表达。本文将带您领略图像识别的技术原理、应用场景以及发展前景。一、图像识别的技术原理图像识别......
  • 问题:Opencv(3.1.0/3.4)找不到 /opencv2/gpu/gpu.hpp 问题
    解决:Opencv(3.1.0/3.4/4.1.0)找不到/opencv2/gpu/gpu.hpp问题环境:系统:Win10环境:Opencv3.4.0/4.1.0显卡:1080ti问题Windows下使用opencv3.4.0/4.1.0调用包含GPU模块函数getCudaEnabledDeviceCount()的示例时提示找不到/opencv2/gpu/gpu.hpp。解决方式替换代码中引用的”gpu“模块......
  • UE 多人像素流配置
    参考:https://docs.unrealengine.com/4.27/zh-CN/SharingAndReleasing/PixelStreaming/Hosting/https://www.bilibili.com/video/BV1cv411M7aY/?spm_id_from=autoNext&vd_source=e7d69fe6f27a4fce66589e592196cbbdhttps://docs.unrealengine.com/4.27/zh-CN/SharingAndRe......