Opencv
文章目录
- Opencv
- 一、读取图片
- 1.imshow
- 2.namedWindow
- 3.imshow
- 4.效果图
- 二、像素操作
- (1).访问像素
- 1. at()
- 2.Mat_
- (2).遍历像素
- 1.指针遍历
- 2.迭代器遍历
- (3).threshold
- (4).通道分离
- 1.split
- 2.merge
- (5)Gamma矫正
- 三、深浅拷贝
一、读取图片
1.imshow
Mat imread(const string& filename, intflags=1 );
flags:
enum
{
/* 8bit, color or not */
CV_LOAD_IMAGE_UNCHANGED =-1,
/* 8bit, gray */
CV_LOAD_IMAGE_GRAYSCALE =0,
/* ?, color */
CV_LOAD_IMAGE_COLOR =1,
/* any depth, ? */
CV_LOAD_IMAGE_ANYDEPTH =2,
/* ?, any color */
CV_LOAD_IMAGE_ANYCOLOR =4
};
Mat image0=imread("dota.jpg",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR);//载入最真实的图像
Mat image1=imread("dota.jpg",0);//载入灰度图
Mat image2=imread("dota.jpg",199);//载入3通道的彩色图像
Mat logo=imread("dota_logo.jpg");//载入3通道的彩色图像
- CV_LOAD_IMAGE_UNCHANGED,这个标识在新版本中被废置了,忽略。
- CV_LOAD_IMAGE_ANYDEPTH- 如果取这个标识的话,若载入的图像的深度为16位或者32位,就返回对应深度的图像,否则,就转换为8位图像再返回。
- CV_LOAD_IMAGE_COLOR- 如果取这个标识的话,总是转换图像到彩色一体
- CV_LOAD_IMAGE_GRAYSCALE- 如果取这个标识的话,始终将图像转换成灰度
- flags >0返回一个3通道的彩色图像。
- flags =0返回灰度图像。
- flags <0返回包含Alpha通道的加载的图像。
2.namedWindow
void namedWindow(const string& winname,int flags=WINDOW_AUTOSIZE );
- WINDOW_NORMAL设置了这个值,用户便可以改变窗口的大小(没有限制)
- WINDOW_AUTOSIZE如果设置了这个值,窗口大小会自动调整以适应所显示的图像,并且不能手动改变窗口大小。
- WINDOW_OPENGL 如果设置了这个值的话,窗口创建的时候便会支持OpenGL。
3.imshow
void imshow(const string& winname, InputArray mat);
4.效果图
c++
python
二、像素操作
(1).访问像素
1. at()
image.at<uchar>(j,i)= value; //单通道
image.at<cv::Vec3b>(j,i)[channel]= value; //三通道
image.at<cv::Vec3b>(j,i) = cv::Vec3b(a,b,c);
2.Mat_
cv::Mat_<uchar> image(image1);
image(20,30) = value;
(2).遍历像素
1.指针遍历
uchar *data = image.ptr<uchar>(i); //ptr()返回行的地址
for (int i = 0; i < height; i++) {
cv::Vec3b* row = image.ptr<cv::Vec3b>(i);
for (int j = 0; j < width; j++) {
cv::Vec3b& pixel = row[j];//Vec3b&直接操作图像中的像素值,而不需要创建新的对象
std::cout << "Pixel at (" << i << "," << j << "): "
<< "B=" << (int)pixel[0] << " "
<< "G=" << (int)pixel[1] << " "
<< "R=" << (int)pixel[2] << std::endl;
}
}
2.迭代器遍历
cv::MatIterator_ <cv::Vec3b> it;
或者
cv::Mat_<cv::Vec3b>::iterator it;
cv::MatIterator_<cv::Vec3b> it, end;
for (it = image.begin<cv::Vec3b>(), end = image.end<cv::Vec3b>(); it != end; ++it) {
cv::Vec3b& pixel = *it;
pixel[0] = 255;
pixel[1] = 0;
pixel[2] = 0;
}
python
c++
(3).threshold
double cv::threshold(src, OutputArray, thresh, maxval, type)
c++:
python:
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
(4).通道分离
1.split
C++: void split(const Mat& src, Mat*mvbegin);
C++: void split(InputArray m,OutputArrayOfArrays mv);
2.merge
C++: void merge(const Mat* mv, size_tcount, OutputArray dst)
C++: void merge(InputArrayOfArrays mv,OutputArray dst)
c++
python
(5)Gamma矫正
Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系。Gamma矫正用于调整图像的亮度和对比度
。Gamma矫正可以改变图像的灰度值分布,使图像在显示时看起来更加自然和逼真。通常情况下,人眼对亮度的感知是非线性的,因此使用Gamma矫正可以更好地模拟人眼的感知特性。
V
o
u
t
=
A
V
i
n
γ
V_{out}=AV_{in}^\gamma
Vout=AVinγ
γ的值决定了输入图像和输出图像之间的灰度映射方式,即决定了是增强低灰度值区域还是增高灰度值区域。
γ>1时,图像的高灰度区域对比度得到增强,直观效果是一幅偏亮的图变暗了下来。
γ<1时,图像的低灰度区域对比度得到增强,直观效果是一幅偏暗的图变亮了起来。
python
c++
三、深浅拷贝
浅拷贝是指当图像之间进行赋值时,图像数据并未发生复制,而是两个对象都指向同一块内存块。
深拷贝是指新创建的图像拥有原始图像的崭新拷贝
c++
python