unsigned char image[480][640]
像的宽度和列数,对应着 X 轴;而图像的行数或高度,则对应着它的 Y 轴。根据这种定义方式,如果我们讨论一个位于 x, y 处的像素,那么它在程序中的访问方式应该是:
unsigned char pixel = image[y][x];
将计算机中图像的 RGB 通道替换成 BGR 通道。(R:red,G:green,B:blue)
以red通道为例,
//导入opencv库
#include
#include
#include
int main(int argc, const char* argv[]){
cv::Mat img = cv::imread("path", cv::IMREAD_COLOR);//运用opencv读取图像,以BGR存储,path为计算机中图片的绝对路径或者相对路径
int height = img.rows;//高为行数
int width = img.cols;//宽为列数
cv::Mat out = img.clone(); //复制定义一个图像
for (int y=0; y(y, x)[0];//定义第三个参数,并把B通道赋值
out.at(y,x)[0] = img.at(y,x)[2];//把R通道赋值给B通道
out.at(y,x)[2] = tmp;//把B通道赋值给R通道
}
}
//cv::imwrite("out.jpg", out);
cv::imshow("sample", out);
cv::waitKey(0);//窗口悬浮
cv::destroyAllWindows();//释放内存空间
return 0;
}
对于cv::Vec3b
对于.at
读写像素
一个RGB像素点的像素值:
Vec3f intensity = Mat.at(y,x)
float blue = intensity.val[0] //获得蓝色通道的像素值
float green = intensity.val[1] //获得绿色通道的像素值
float red = intensity.val[2] //获得红色通道的像素值
整型:
int b = srcImage.at(row, col)[0]; //获取像素值b
int g = srcImage.at(row, col)[1]; //获取像素值g
int r = srcImage.at(row, col)[2]; //获取像素值r
将图像灰度化!灰度是一种图像亮度的表示方法,通过下式计算:
Y = 0.2126 R + 0.7152 G + 0.0722 B
#include
#include
#include
int main(int argc, const char* argv[]){
cv::Mat img = cv::imread("path", cv::IMREAD_COLOR)//cv::IMREAD_COLOR默认本身彩图格式读取
int height = img.rows;
int width = img.cols;
cv::Mat out = cv::Mat::zeros(height, width, CV_8UC1); //定义相同分辨率的单通道矩阵
for (int y=0; y<height; y++){
for (int x=0; x<width; x++){
out.at<uchar>(y, x) = (int)((float)img.at<cv::Vec3b>(y,x)[0] * 0.0722 + \
(float)img.at<cv::Vec3b>(y,x)[1] * 0.7152 + \
(float)img.at<cv::Vec3b>(y,x)[2] * 0.2126); //公式
}
}
//cv::imwrite("out.jpg", out);
cv::imshow("answer", out);
cv::waitKey(0);
cv::destroyAllWindows();//释放内存
return 0;
}
对于 CV_8UC1
矩阵数据类型:
– CV_
S = 符号整型 U = 无符号整型 F = 浮点型
CV_8UC1 是指一个8位无符号整型单通道矩阵
CV_32FC2是指一个32位浮点型双通道矩阵
CV_8UC1 CV_8SC1 CV_16U C1 CV_16SC1
CV_8UC2 CV_8SC2 CV_16UC2 CV_16SC2
CV_8UC3 CV_8SC3 CV_16UC3 CV_16SC3
CV_8UC4 CV_8SC4 CV_16UC4 CV_16SC4
CV_32SC1 CV_32FC1 CV_64FC1
CV_32SC2 CV_32FC2 CV_64FC2
CV_32SC3 CV_32FC3 CV_64FC3
CV_32SC4 CV_32FC4 CV_64FC4
其中,通道表示每个点能存放多少个数,类似于RGB彩色图中的每个像素点有三个值,即三通道的。
图片中的深度表示每个值由多少位来存储,是一个精度问题,一般图片是8bit(位)的,则深度是8.
_32FC3 CV_64FC3
CV_32SC4 CV_32FC4 CV_64FC4
其中,通道表示每个点能存放多少个数,类似于RGB彩色图中的每个像素点有三个值,即三通道的。
图片中的深度表示每个值由多少位来存储,是一个精度问题,一般图片是8bit(位)的,则深度是8.