Opencv实战(1)读取与图像操作

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++

Opencv实战(1)读取与图像操作_第1张图片

python

Opencv实战(1)读取与图像操作_第2张图片

二、像素操作

(1).访问像素

1. at()
image.at(j,i)= value;  //单通道
image.at(j,i)[channel]= value;  //三通道
image.at(j,i) = cv::Vec3b(a,b,c);
2.Mat_
cv::Mat_<uchar> image(image1);
image(20,30) = value;

(2).遍历像素

1.指针遍历
uchar *data = image.ptr(i);  //ptr()返回行的地址
for (int i = 0; i < height; i++) {
    cv::Vec3b* row = image.ptr(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_  it;
或者
cv::Mat_::iterator it;
cv::MatIterator_ it, end;
for (it = image.begin(), end = image.end(); it != end; ++it) {
    
    cv::Vec3b& pixel = *it;
    
    pixel[0] = 255; 
    pixel[1] = 0; 
    pixel[2] = 0; 
}

python

Opencv实战(1)读取与图像操作_第3张图片

c++

Opencv实战(1)读取与图像操作_第4张图片

(3).threshold

double cv::threshold(src, OutputArray, thresh, maxval, type)

Opencv实战(1)读取与图像操作_第5张图片

c++:

Opencv实战(1)读取与图像操作_第6张图片

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++
Opencv实战(1)读取与图像操作_第7张图片

python

Opencv实战(1)读取与图像操作_第8张图片

(5)Gamma矫正

Gamma校正是对输入图像灰度值进行的非线性操作,使输出图像灰度值与输入图像灰度值呈指数关系。Gamma矫正用于调整图像的亮度和对比度。Gamma矫正可以改变图像的灰度值分布,使图像在显示时看起来更加自然和逼真。通常情况下,人眼对亮度的感知是非线性的,因此使用Gamma矫正可以更好地模拟人眼的感知特性。
V o u t = A V i n γ V_{out}=AV_{in}^\gamma Vout=AVinγ
γ的值决定了输入图像和输出图像之间的灰度映射方式,即决定了是增强低灰度值区域还是增高灰度值区域。
γ>1时,图像的高灰度区域对比度得到增强,直观效果是一幅偏亮的图变暗了下来。
γ<1时,图像的低灰度区域对比度得到增强,直观效果是一幅偏暗的图变亮了起来。

python

Opencv实战(1)读取与图像操作_第9张图片

c++

三、深浅拷贝

浅拷贝是指当图像之间进行赋值时,图像数据并未发生复制,而是两个对象都指向同一块内存块。

深拷贝是指新创建的图像拥有原始图像的崭新拷贝

c++

Opencv实战(1)读取与图像操作_第10张图片

python

Opencv实战(1)读取与图像操作_第11张图片

你可能感兴趣的:(Opencv学习,opencv,人工智能,计算机视觉)