初学opencv c++学习笔记(四)图像的相关操作及属性

内容涉及到图像读取的at()操作,图像的拆分和合并的参数解释和代码,以及一些常用的图像属性的内置函数。


提示:以下是本篇文章正文内容,下面案例可供参考

一、图像的读写操作at()函数

apI:at()


单通道图像:img.at<uchar>(i,j)            

    表示在第i行,第j列的像素值

多通道图像:img.at<Vec3b>(i,j)[c]       

    表示在某个通道中第i行,第j列的像素值

  • <>中为图像元素的类型。uchar为无符号字符型,Vec3b等于vector<uchar,3>,表示一个uchar类型的数组,长度为3。
  • (i,j)指像素点的位置。
  • [c]表示通道。RGB图像,由于opencv中按照BGR顺序,所以[0],[1],[2]分别表示B,G,R通道。


  

二、图像通道的拆分与合并

apl:split()


1.通道拆分

官方定义:

void split(InputArray m, OutputArrayOfArrays mv);

 参数解释:

(1) :    输入的多通道图像,对该图像进行通道的拆分。

(2) mv :    存放图像拆分后的三个通道的灰度图像的容器。mv为图像数组,使用vector容器。

代码演示:

#include <opencv2/imgcodecs.hpp>       //imread
#include <opencv2/highgui.hpp>         //imshow  waitKey
 
using namespace std;
using namespace cv;

int main()
{
    vector<Mat> channels;//声明vector,作为分离后三个通道的图像的保存容器
    Mat img = imread("C:/r/bear.jpg");//读取图片

    split(img,channels);//使用split()函数,分离img的B.G.R三个通道
    Mat B = channels.at(0);//下标读取 默认顺序B-G-R
    Mat G = channels.at(1);
    Mat R = channels.at(2);

    imshow("原图", img);//显示原图
    imshow("blue", B);  //显示三通道图像
    imshow("green", G);
    imshow("red", R);
    waitKey(0);
    return 0;
}

 分离后的三个通道的图像为灰度图像,表示强度

2.通道合并

apl:merge()


官方定义:

void merge(InputArrayOfArrays mv, OutputArray dst);

参数解释:

(1)mv : 同通道的拆分。为拆分后的多通道的图像数组。

(2)dst : 存放合并后的图像。

代码演示:

#include <opencv2/imgcodecs.hpp>       //imread
#include <opencv2/highgui.hpp>         //imshow  waitKey
 
using namespace std;
using namespace cv;

int main()
{
    vector<Mat> channels;//声明vector,作为分离后三个通道的图像的保存容器
    Mat img = imread("C:/r/bear.jpg");//读取图片

    split(img,channels);//使用split()函数,分离img的B.G.R三个通道

    Mat dst;
    merge( channels,dst);//合并三通道
    imshow("outPutArray", dst);//展示合并后的熊大
    waitKey(0);
    return 0;
}
重新获得颜色的熊大


 三、图像的属性

 下面进行列举 

1.列举解释

  • src.size() 返回图像尺寸

size中的参数先宽度(width)后高度(height)

src.size().width  ==  src.cols       (宽度==列)

src.size().heght  ==  src.rows (高度==行)

  • src.depth() 返回深度

 度量每一个像素每一个通道的精度,位数(bit)(0~6)

数值越大,精度越高

  • src.channels() 返回通道数
  • src.elemSize() 返回一个元素所占的字节数 

 一个元素单通道的字节数 * 通道数

  • src.elemSize1() 返回一个元素单通道的所占字节数

 src.elemSize1()==src.elemSize() / src.channels()

  • src.total() 返回像素总数
  • src.step 返回每一行的步长(字节数) 每一行所有元素的字节总量

 src.step==宽度*通道数

  • src.step1() 

src.step1() == e1()src.step / src.elemSize1()

  • src.step [0]  一行元素的字节数
  • src.step [1]  一个元素的字节数
  • src.step1 (0)  一行元素的通道数
  • src.step1 (1)  一个元素的通道数
  • src.isContinuous()  判断src是否在内存上连续

src.isContinuous()?"true":"false"

  • src.isSubmatrix()  判断src是否为子矩阵
  • src.type()  元素类型以及矩阵的通道个数

 2.表格汇总

apl返回值
src.size()图像尺寸
src.depth()图像深度id
src.channels()预想通道数
src.elemSize()一个元素所占字节数
src.elemSize1()一个元素单通道的所占字节数
src.total()像素总数
src.step每一行的步长(字节数)
src.step1()
src.step [0]一行元素的字节数
src.step [1]一个元素的字节数
src.step1 (0)一行元素的通道数
src.step1 (1)一个元素的通道数
src.isContinuous()判断src是否在内存上连续
src.isSubmatrix()判断src是否为子矩阵
src.type()元素类型以及矩阵的通道个数

总结

以上就是今天的笔记,内容涉及到图像读取的at()操作,图像的拆分和合并的参数解释和代码,以及一些常用的图像属性的内置函数。

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
OpenCV是一个开源计算机视觉库,提供了许多用于图像处理的函数和工具。下面是使用OpenCV C++实现图像处理基本操作的步骤: 1. 首先,需要在C++程序中包含OpenCV的头文件: ```c++ #include <opencv2/core/core.hpp> #include <opencv2/imgcodecs.hpp> #include <opencv2/highgui.hpp> #include <opencv2/imgproc.hpp> #include <iostream> ``` 2. 读取图像文件并显示图像: ```c++ cv::Mat image = cv::imread("example.jpg"); // 读取图像文件 cv::imshow("Image", image); // 显示图像 cv::waitKey(0); // 等待用户输入任意键继续 ``` 3. 转换图像的颜色空间: ```c++ cv::Mat gray_image; cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY); // 将图像从BGR色彩空间转换为灰度色彩空间 cv::imshow("Gray Image", gray_image); cv::waitKey(0); ``` 4. 图像的平滑滤波: ```c++ cv::Mat blur_image; cv::GaussianBlur(image, blur_image, cv::Size(5, 5), 0); // 高斯滤波 cv::imshow("Blur Image", blur_image); cv::waitKey(0); ``` 5. 图像的边缘检测: ```c++ cv::Mat canny_image; cv::Canny(image, canny_image, 100, 200, 3); // Canny边缘检测 cv::imshow("Canny Image", canny_image); cv::waitKey(0); ``` 6. 识别图像中的轮廓: ```c++ cv::Mat contour_image = image.clone(); // 克隆原始图像,以便在上面绘制轮廓 cv::cvtColor(image, gray_image, cv::COLOR_BGR2GRAY); // 首先将图像从BGR色彩空间转换为灰度色彩空间 cv::threshold(gray_image, gray_image, 100, 255, cv::THRESH_BINARY); // 二值化图像 std::vector<std::vector<cv::Point>> contours; // 存储轮廓点的向量 std::vector<cv::Vec4i> hierarchy; // 存储轮廓层次结构的向量 cv::findContours(gray_image, contours, hierarchy, cv::RETR_TREE, cv::CHAIN_APPROX_SIMPLE); // 查找轮廓 for (int i = 0; i < contours.size(); i++) // 遍历所有轮廓并绘制 { cv::Scalar color = cv::Scalar(0, 0, 255); // 定义轮廓颜色(红色) cv::drawContours(contour_image, contours, i, color, 2, cv::LINE_8, hierarchy, 0); // 在图像上绘制每个轮廓 } cv::imshow("Contour Image", contour_image); cv::waitKey(0); ``` 引用: opencv(c++)实现图像处理基本操作。常见头文件 #include<opencv2/core/core.hpp> #include<opencv2/imgcodecs.hpp> #include<opencv2/highgui.hpp> #include<opencv2/imgproc.hpp> #include<iostream> [^1]。引用:Opencv c++图像处理)。openCV 中 cv::Rect 矩形类用法_sinat_38102206的博客-CSDN博客_cv rect [^2]。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值