void main(){Mat src1; src1 _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);//显示延时 }
原彩色图像:
原灰度图像:
新灰度图像:
新彩色图像:
欢迎各位路友留言讨论~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。