运行平台
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);//显示延时
}
实验结果
原彩色图像:
原灰度图像:
新灰度图像:
新彩色图像:
欢迎各位路友留言讨论~