void main(){Mat src1; src1 _c++ cv数组转图像">
当前位置:   article > 正文

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

c++ cv数组转图像

运行平台

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);//显示延时
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57

实验结果

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

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

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号