如何用opencv提取一张图片的像素矩阵

如何用opencv提取一张图片的像素矩阵,第1张

*** 作单个像素方法:

at(int y, int x)

cv::mat的成员函数: at(int y, int x)可以用来存取图像中对应坐标为(x,y)的元素坐标。但是在使用它时要注意,在编译期必须要已知图像的数据类型,这是因为cv::mat可以存放任意数据类型的元素。因此at方法的实现是用模板函数来实现的。

使用方法:假设提前已知一幅图像img的数据类型为 unsigned char型灰度图(单通道),要对坐标为(10,12)的像素重新赋值为128,则对应 *** 作如下

imgat<uchar>(12,10) = 128;

开始写OpenCV这篇文章的时候,不由想到,我的大学计算机图形学的第一门实 *** 课程就是灰度转化,拉普拉斯锐化等。其中灰度图的转化,是计算机图形学基础中基础,这里就顺着OpenCV的灰度的转化,来看看OpenCV一些基础的api。

本文地址: >

由于算法的需要,需要把彩色图像的R、G、B值分离出来,OpenCV中正好有split() 和 merge() 函数可以实现。

一、对单独彩色的RGB通道分离:

#include <iostream>

#include "cvh"

#include "highguih"

using namespace std;

using namespace cv;

int main(int argc,char argv[])

{

Mat img = imread("lenajpg"/,CV_LOAD_IMAGE_COLOR/);

Mat channel[3];

split(img,channel);

imshow("original",img);

imshow("B",channel[0]);

imshow("G",channel[1]);

imshow("R",channel[2]);

//set blue channel to 0

channel[0] = Mat::zeros(imgrows,imgcols,CV_8UC1);

//merge red and green channels

merge(channel,3,img);

imshow("R_G_merge",img);

waitKey(0);

return 1;

}

二、对摄像头摄入视频帧的RGB彩色通道分离

int main(int argc,char argv[])

{

VideoCapture cap;

capopen(0);

if(!capisOpened())

{

exit(0);

}

capset(CV_CAP_PROP_FRAME_WIDTH,250);

capset(CV_CAP_PROP_FRAME_HEIGHT,250);

cout << "Frame Width: " << capget(CV_CAP_PROP_FRAME_WIDTH) << endl;

cout << "Frame Height: " << capget(CV_CAP_PROP_FRAME_HEIGHT) << endl;

Mat frame;

vector<Mat> rgb;

cap >> frame;

//rgbpush_back( Mat(framerows, framecols, CV_8UC1));

//rgbpush_back( Mat(framerows, framecols, CV_8UC1));

//rgbpush_back( Mat(framerows, framecols, CV_8UC1));

//rgbpush_back( Mat(framerows, framecols, CV_8UC1));

namedWindow("original", 1);

namedWindow("red", 1);

namedWindow("green", 1);

namedWindow("blue", 1);

for(;;)

{

cap >> frame;

imshow("original", frame);

split(frame, rgb);

imshow("red", rgbat(2));

imshow("green", rgbat(1));

imshow("blue", rgbat(0));

if(waitKey(30) >= 0)

break;

}

waitKey(0);

return 1;

}

1split()函数

此函数的作用是将一个图像通道进行分离。

首先看一下split()函数定义:

void split(const Mat& m, vector<Mat>& mv );

参数说明:

第一个参数,const Mat&类型的src,填我们需要进行分离的图像;

第二个参数,vector<Mat>类型的mv,填函数的输出数组或者输出的vector容器,即分离后的图像;

2merge()函数

merge()函数的功能是split()函数的逆向 *** 作,将多个数组合并成一个多通道的数组。

首先看一下merge()函数定义:

void merge(const vector<Mat>& mv, OutputArray dst );

参数说明:

第一个参数,const <Mat>类型的mv,填需要被合并的vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度;说白了就是前面被split()函数分离后的图像通道。

第二个参数,保存为合并后的图像;

#include <opencv2/core/corehpp>

#include <opencv2/highgui/highguihpp>

#include <opencv2/imgproc/imgprochpp>

#include <iostream>

using namespace cv;

using namespace std;

int main()

{

//0定义相关变量

Mat srcImage, newImage; //源图像、通道合并后的图像

Mat srcImage_B, srcImage_G, srcImage_R; //R、G、B各个通道

Mat image_H, image_S, image_V; //H、S、V各个通道

vector<Mat> channels_BGR; //vector<Mat>: 可以理解为存放Mat类型的容器(数组)

vector<Mat> channels_HSV;

//1读取原始图像并检查图像是否读取成功

srcImage = imread("D:\\OutPutResult\\ImageTest\\adogjpg"); //请修改为自己的图像路径

if (srcImageempty())

{

cout << "读取图像有误,请重新输入正确路径!\n";

return -1;

}

imshow("srcImage源图像", srcImage); //在窗口显示源图像

//2对加载的原图像进行通道分离,即把一个3通道图像转换成为3个单通道图像

split(srcImage, channels_BGR);

//0通道为B分量,1通道为G分量,2通道为R分量。因为:RGB色彩空间在opencv中默认通道顺序为BGR!!!

srcImage_B = channels_BGRat(0);

srcImage_G = channels_BGRat(1);

srcImage_R = channels_BGRat(2);

imshow("srcImage_B通道", srcImage_B); //分别显示R,G,B各个通道图像

imshow("srcImage_G通道", srcImage_G);

imshow("srcImage_R通道", srcImage_R);

//3将BGR颜色空间转换为HSV颜色空间

Mat image_hsv;

cvtColor(srcImage, image_hsv, CV_BGR2HSV);

imshow("HSV颜色空间图像", image_hsv);

//4对加载的HSV图像进行通道分离

split(image_hsv, channels_HSV);

//0通道为H分量,1通道为S分量,2通道为V分量

image_H = channels_HSVat(0);

image_S = channels_HSVat(1);

image_V = channels_HSVat(2);

imshow("image_H通道", image_H);//分别显示H,S,V各个通道图像

imshow("image_S通道", image_S);

imshow("image_V通道", image_V);

//5将3个单通道重新合并成一个三通道图像

merge(channels_HSV, newImage);

imshow("将H,S,V通道合并后的图像", newImage);

//6保持等待状态

waitKey(0);

return 0;

}

5程序说明

看到这里,可能有人会问为什么分离出的通道都是黑白灰,而不是红绿蓝?

原因是分离后为单通道,相当于分离通道的同时把其他两个通道填充了相同的数值。比如红色通道,分离出红色通道的同时,绿色和蓝色被填充为和红色相同的数值,这样一来就只有黑白灰了。那么红色体现在哪呢?可以进行观察,会发现原图中颜色越接近红色的地方在红色通道越接近白色。

====================分割线===============

此程序共显示9个窗口。

先将RGB图像通道分离,分别显示R、G、B、单个通道;

后将RGB颜色空间转为HSV空间,将HSV图像通道分离,分别显示H、S、V、单个通道;

最后将H、S、V、单个通道重新合并为3通道图像;

=========================END======================

原理上 把 RGBA 转为 RGB

看看有没有彩色图像转换函数:

cvtColor(srcRgba , src , CV_RGBA2RGB);

(我没有OpenCv,不好查看,只好猜测)。

以上就是关于如何用opencv提取一张图片的像素矩阵全部的内容,包括:如何用opencv提取一张图片的像素矩阵、OpenCV (一)Mat基本 *** 作以及灰度图转化、彩色图压缩时的通道分离用代码怎么表示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9571493.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-29
下一篇2023-04-29

发表评论

登录后才能评论

评论列表(0条)

    保存