C++调用OpenCV实现将灰度/彩色图像像素值保留到数组中,将数组中的值转换到Mat,并显示数组对应的灰度图像和彩色图像。(数组与Mat的转换,vector与Mat的转换)

运行平台

Windows10,64位
VS2019
OpenCV3.6
需要提前将OpenCV3.6配置到VS2019中,配置过程参考网上教程。

功能简介

灰度图像,彩色图像像素值的提取,并保存到数组中
将数组中的值转换到Mat中分别显示为灰度图像和彩色图像
彩色图像信道分分离,以及多信道融合
代码部分有详细的讲解

代码实现

#include<stdio.h>
#include "opencv2/opencv.hpp"
#include<vector>
void main(){
Mat src1;
 src1 = imread("C://Users//Administrator//Desktop//cat.jpg");//彩色图像
 Mat src;
 cvtColor(src1, src, CV_BGR2GRAY);//转换为灰度图像,并保存到src中
 imshow("原彩色图",src1);//显示彩色图像
 waitKey(1000);//显示延时
 imshow("原灰度图", src);//显示灰度图像
 waitKey(1000);//显示延时
 int row = src.rows;//图像的行
 int col = src.cols;//图像的列
 vector<vector<int>>a;//定义一个二维数组,用于保留灰度图像的像素值
 printf("row:%d\tcol:%d\n", row, col);//打印图像的行和列
 for (int i = 0; i < row; i++) {//将灰度图像的像素值,提取出来,保留在二维数组a中
  vector<int>p;
  for (int j = 0; j < col; j++) {  
   p.push_back(src.at<uchar>(i, j));//src.at<uchar>(i, j)代表图像的(i, j)位置的像素值 
  }
  a.push_back(p); 
 } 
Mat img2 = Mat(row, col, CV_8UC1);//图像img2:row*col大小  这里只是定义了img2图像的大小还没有传递图像的信息
vector<Mat>chanel;
vector<Mat>chanel2;
split(src1, chanel);//将彩色图像src1进行信道分离,分为B、G、R三个,并保存到chanel中
Mat temp = Mat(row, col, CV_8UC1);//用于接收二维数组,灰度图像
//定义三个临时的图像,分别接收由彩色图像三个通道数组值
Mat temp1=Mat(row, col, CV_8UC1);
Mat temp2 = Mat(row, col, CV_8UC1);
Mat temp3= Mat(row, col, CV_8UC1);
for (int i = 0; i < row; i++)
 {
  
  for (int j = 0; j < col; j++)
  {
   
   temp.at<uchar>(i, j) = a[i][j];//将灰度图像的二维数组值传递给temp
   //彩色图像的三通道B、G、R像素值分别保留到temp1、temp2、temp3
   temp1.at<uchar>(i, j) = chanel.at(0).at<uchar>(i, j);//B通道chanel.at(0).at<uchar>(i, j)的(i,j)位置的像素值
   temp2.at<uchar>(i, j) = chanel.at(1).at<uchar>(i, j);//G通道chanel.at(1).at<uchar>(i, j)的(i,j)位置的像素值
   temp3.at<uchar>(i, j) = chanel.at(2).at<uchar>(i, j);//R通道chanel.at(2).at<uchar>(i, j)的(i,j)位置的像素值
   
  }   
}
//将三通道汇集到一个chanel2中,便于通过vector转化到Mat中
 chanel2.push_back(temp1);
 chanel2.push_back(temp2);
 chanel2.push_back(temp3);
merge(chanel2, img2);//信道融合,将chanel2中的三通道融合到彩色图像img2中
 
imshow("新灰度图", temp);
waitKey(1000);//显示延时

imshow("新彩色图像", img2);
waitKey(1000);//显示延时
}

实验结果

原彩色图像:
在这里插入图片描述

原灰度图像:
在这里插入图片描述
新灰度图像:
在这里插入图片描述
新彩色图像:
在这里插入图片描述
欢迎各位路友留言讨论~

  • 2
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值