C++结合OpenCV:图像的像素处理基础

这篇具有很好参考价值的文章主要介绍了C++结合OpenCV:图像的像素处理基础。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

像素是图像构成的基本单位,像素处理是图像处理的基本操作,可以通过位置索引的形式对图像内的元素进行访问、处理。

二值图像: 是一种特殊的灰度图像,在OPENCV中,将黑定义为0,255定义为白。 在OPENCV中,二值图像/灰度图像以二维数组形式进行存放彩色图像以三维数组形式进行存放(X*Y*3, 通道存放顺序为BGR,X,Y为图像x,y轴向上的像素点个数)。

为了方便理解,我们首先来生成一个8×8大小的数组,用来模拟一个黑色图像,并对其进行简单处理。

【例1】使用OpenCV库来创建一个8x8的黑色图像,所有元素的值都是0,然后修改其中一个像素点的值,并显示修改后的图像。根据题目要求及分析,编写代码如下:

#include <iostream>  

#include <opencv2/opencv.hpp>  

int main() {  

    cv::Mat img = cv::Mat::zeros(8, 8, CV_8UC1);  

    std::cout << "img=\n" << img << std::endl;  

    cv::imshow("one", img);  

    std::cout << "读取像素点img[0,3]=" << img.at<uchar>(0, 3) << std::endl;  

    img.at<uchar>(0, 3) = 255;  

    std::cout << "修改后img=\n" << img << std::endl;  

    std::cout << "读取修改后像素点img[0,3]=" << img.at<uchar>(0, 3) << std::endl;  

    cv::imshow("two", img);  

    cv::waitKey();  

    cv::destroyAllWindows();  

    return 0;  

}

代码分析如下。

● 使用OpenCV库生成了一个8×8大小的二维数组,其中所有的值都是0,数值类型是np.uint8。根据该数组的属性,可以将其看成一个黑色的图像。

● 语句img[0,3]访问的是img第0行第3列的像素点,需要注意的是,行序号、列序号都是从0开始的。

● 语句img[0,3]=255将img中第0行第3列的像素点的像素值设置为“255”。

运行上述程序,会出现名为one和two的两个非常小的窗口,其中:

● 名为one的窗口是一个纯黑色的图像。

● 名为two的窗口在顶部靠近中间位置有一个白点(对应修改后的值255),其他地方也都是纯黑的图像。同时,在控制台会输出如下内容:

img= [
[0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0]

[0 0 0 0 0 0 0 0]]

读取像素点img[0,3]= 0

修改后img= [

[ 0 0 0 255 0 0 0 0]

[ 0 0 0 0 0 0 0 0]

[ 0 0 0 0 0 0 0 0]

[ 0 0 0 0 0 0 0 0]

[ 0 0 0 0 0 0 0 0]

[ 0 0 0 0 0 0 0 0]

[ 0 0 0 0 0 0 0 0]

[ 0 0 0 0 0 0 0 0]]

读取修改后像素点img[0,3]= 255

通过本例中两个窗口显示的图像可知,二维数组与图像之间存在对应关系。

【例2】读取一个灰度图像,并对其像素进行访问、修改。根据题目要求,编写代码如下:

#include <opencv2/opencv.hpp>  

int main() {  

    cv::Mat img = cv::imread("lena.bmp", cv::IMREAD_GRAYSCALE);  

    if (img.empty()) {  

        std::cout << "无法读取图像" << std::endl;  

        return -1;  

    }  

    cv::imshow("before", img);  

    cv::waitKey(0);  

    for (int i = 100; i < 120; i++) {  

        for (int j = 100; j < 120; j++) {  

            img.at<uchar>(i, j) = 255;  

        }  

    }  

    cv::imshow("after", img);  

    cv::waitKey(0);  

    cv::destroyAllWindows();  

    return 0;  

}

在本例中,使用了一个嵌套循环语句,将图像img中“第100行到119行”与“第100列到119列”交叉区域内的像素值设置为255。从图像img上来看,该交叉区域被设置为白色。运行程序,结果如图1所示,其中:

C++结合OpenCV:图像的像素处理基础,SpireCV,c++,opencv,开发语言

图1 像素修改示例

● 左图是读取的原始图像。

● 右图是经过修改后的图像。

2.彩色图像RGB模式的彩色图像在读入OpenCV内进行处理时,会按照行方向依次读取该RGB图像的B通道、G通道、R通道的像素点,并将像素点以行为单位存储在ndarray的列中。例如,有一幅大小为R行×C列的原始RGB图像,其在OpenCV内以BGR模式的三维数组形式存储,如图2所示。

C++结合OpenCV:图像的像素处理基础,SpireCV,c++,opencv,开发语言

图2 RGB图像以三维数组形式存储的情况说明

可以使用表达式访问数组内的值。例如,可以使用image[0][0][0]访问图像image的B通道内的第0行第0列上的像素点,式中:

● 第1个索引表示第0行。

● 第2个索引表示第0列。

● 第3个索引表示第0个颜色通道。

根据上述分析可知,假设有一个红色(其R通道值为255, G通道值为0, B通道值为0)图像,不同的访问方式得到的值如下:

● img[0][0]:访问图像img第0行第0列像素点的BGR值。图像是BGR格式的,得到的数值为[0,0,255]。

● img[0][0][0]:访问图像img第0行第0列第0个通道的像素值。图像是BGR格式的,所以第0个通道是B通道,会得到B通道内第0行第0列的位置所对应的值0。

● img[0][0][1]:访问图像img第0行第0列第1个通道的像素值。图像是BGR格式的,所以第1个通道是G通道,会得到G通道内第0行第0列的位置所对应的值0。

● img[0][0][2]:访问图像img第0行第0列第2个通道的像素值。图像是BGR格式的,所以第2个通道是R通道,会得到R通道内第0行第0列的位置所对应的值255。

彩色图像的像素级处理

【例3】生成一个三维数组,用来观察三个通道值的变化情况。根据题目要求,编写代码如下:

#include <opencv2/opencv.hpp>  

int main() {  

    // 创建一个300x300大小的蓝色通道图像  

    cv::Mat blue(300, 300, CV_8UC3, cv::Scalar(0, 0, 255));  

    cv::imshow("blue", blue);  

    // 创建一个300x300大小的绿色通道图像  

    cv::Mat green(300, 300, CV_8UC3, cv::Scalar(255, 0, 0));  

    cv::imshow("green", green);  

    // 创建一个300x300大小的红色通道图像  

    cv::Mat red(300, 300, CV_8UC3, cv::Scalar(0, 255, 0));  

    cv::imshow("red", red);  

    // 等待用户按键,然后关闭所有窗口  

    cv::waitKey(0);  

    cv::destroyAllWindows();  

    return 0;  

}

在本例中,分别生成了blue、green、red三个数组,其初始值都是0。接下来,分别改变各通道值。

● 针对数组blue,将其第0个通道的值设置为255。从图像角度来看,图像blue的B通道值为255,其余两个通道值为0,因此图像blue为蓝色图像。

● 针对数组green,将其第1个通道的值设置为255。从图像角度来看,图像green的G通道值为255,其余两个通道值为0,因此图像green为绿色图像。● 针对数组red,将其第2个通道的值设置为255。从图像角度来看,图像red的R通道值为255,其余两个通道值为0,因此图像red为红色图像。运行上述程序,会显示颜色为蓝色、绿色、红色的三幅图像,分别对应数组blue、数组green、数组red。因为黑白印刷无法显示彩色图像,所以请读者运行程序后观察结果。

除了显示图像,还会显示每个数组的输出值,部分输出结果如图3所示。

C++结合OpenCV:图像的像素处理基础,SpireCV,c++,opencv,开发语言

图3 【例3】程序的部分输出结果文章来源地址https://www.toymoban.com/news/detail-794107.html

到了这里,关于C++结合OpenCV:图像的像素处理基础的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • OpenCV [c++](图像处理基础示例小程序汇总)

    推荐 原创 NCUTer 2023-04-04 14:18:49 文章标签 Image 图像处理 文章分类 计算机视觉 人工智能 在51CTO的第一篇博文 阅读数 1467 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. waitKey()函数的功能是不断刷新图像,频率为delay,单位是ms。 delay为0时,则会一直显示这一帧。 delay不为0时,则

    2024年02月04日
    浏览(28)
  • OpenCV单通道图像按像素成倍比例放大(无高斯平滑处理)

    OpenCV中的resize函数可以对图像做任意比例的放大(/缩小)处理,该处理过程会对图像做高斯模糊化以保证图像在进行放大(/缩小)后尽可能保留源图像所展现的具体内容(消除固定频率插值/采样带来的香农采样信息损失),但在有些场景中该方法不适用,如:部分应用场景只

    2024年04月11日
    浏览(35)
  • Opencv C++ 三、通过鼠标点击操作获取图像的像素坐标和像素值 四、生成一个简单的灰度图像。

    该操作首先需要创建一个头文件 在该头文件内进行编写: 而后双击打开源文件: 在源文件内编写: 执行该程序: 显示内容为上图,而后在右侧image窗口内任意点击一个位置: 就会显示该位置的坐标信息和像素值。 由于该图像为RBG彩色图像,不是单通道的灰度影像,不能显

    2024年04月28日
    浏览(28)
  • C++结合OpenCV:图像的加法运算

    一、图像运算 针对图像的加法运算、位运算都是比较基础的运算。但是,很多复杂的图像处理功能正是借助这些基础的运算来完成的。所以,牢固掌握基础操作,对于更好地实现图像处理是非常有帮助的。本章简单介绍了加法运算、位运算,并使用它们实现了位平面分解、图

    2024年01月18日
    浏览(34)
  • C++结合OpenCV:图像的基本表示方法

            二值图像是指仅仅包含黑色和白色两种颜色的图像。在计算机中,通过一个栅格状排列的数据集(矩阵)来表示和处理图像。例如,图1是一个字母A的图像,计算机在处理该图像时,会首先将其划分为一个个的小方块,每一个小方块就是一个独立的处理单位,称为

    2024年02月01日
    浏览(30)
  • ROS学习笔记15:ROS与OpenCV结合处理图像

      安装OpenCV sudo apt-get install ros-kinetic-vision-opencv libopencv-dev python-opencv   ROS进行图像处理是依赖于OpenCV库的。ROS通过一个叫CvBridge的功能包,将获取的图像数据转换成OpenCV的格式,OpenCV处理之后,传回给ROS进行图像显示(应用),如下图:   我们使用ROS驱动获取摄像头数

    2024年02月05日
    浏览(29)
  • 【计算机视觉—python 】 图像处理入门教程 —— 图像属性、像素编辑、创建与复制、裁剪与拼接【 openCV 学习笔记 005 to 010 and 255】

    OpenCV中读取图像文件后的数据结构符合Numpy的ndarray多维数组结构,因此 ndarray 数组的属性和操作方法可用于图像处理的一些操作。数据结构如下图所示: img.ndim:查看代表图像的维度。彩色图像的维数为3,灰度图像的维度为2。 img.shape:查看图像的形状,代表矩阵的行数(高

    2024年01月19日
    浏览(44)
  • opencv基础53-图像轮廓06-判断像素点与轮廓的关系(轮廓内,轮廓上,轮廓外)cv2.pointPolygonTest()

    在 OpenCV 中,函数 cv2.pointPolygonTest()被用来计算点到多边形(轮廓)的最短距离(也 就是垂线距离),这个计算过程又称点和多边形的关系测试。该函数的语法格式为: retval = cv2.pointPolygonTest( contour, pt, measureDist ) 式中的返回值为 retval,与参数 measureDist 的值有关。 式中的参数

    2024年02月13日
    浏览(28)
  • 【高性能计算】opencl语法及相关概念(四):结合opencv进行图像高斯模糊处理

    高斯模糊是一种常用的图像处理技术,用于减少图像中的噪点和细节,并实现图像的平滑效果。它是基于高斯函数的卷积操作,通过对每个像素周围的邻域像素进行加权平均来实现模糊效果。 具体而言,高斯模糊通过在图像上滑动一个卷积核,将卷积核与输入图像的对应像素

    2024年02月10日
    浏览(36)
  • (3-1)OpenCV图像视觉处理:OpenCV基础

    OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它提供了很多函数,这些函数非常高效地实现了计算机视觉算法(最基本的滤波到高级的物体检测皆有涵盖)。在本章的内容中,将详细讲解在P ython程序中使用 OpenCV 实现 图像视觉处理的 知识,为读者步入本书

    2024年02月21日
    浏览(36)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包