opencv图像处理教程C++(五)图像基本操作

本节直接用代码讲解一些图像的基本操作
像素级访问
第一种方法:模板函数at<>
uchar pixel=img.at(0,0); //获得灰度图像0,0点像素
Vec3b pixel=img.at(0,0); //获得3波段图像的第一个波段(0,0)像素。
第二种方法:函数ptr
他返回图像特定行的指针。因此可以得到每一行的数据,时间复杂度降低,
如下代码获取一副彩色图像的每个像素值。

    uchar R,G,B;//降低时间复杂度
    for (int i=0;i<img.rows;i++)    //遍历行
    Vec3b pixRow=img.ptr<Vec3b>(i);
    for (int j=0;j<img.cols;j++) {   //遍历**列**
    B=pixRow[j][0];
    G=pixRow[j][1];
    R=pixRow[j][2];
   }

Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。
Vec3f对应三通道的float类型数据

#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include<opencv2/face.hpp>
#include<iostream>
#include<math.h>
#include <string> 
#include<fstream> 
using namespace cv::face;
using namespace cv;
using namespace std;
using namespace cv::xfeatures2d;
int main()
{
    Mat src = imread("C:/Users/Administrator/Desktop/pic/5.jpg") ;
    imshow("input", src);

    Mat gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);
    imshow("output1", gray);
    Mat gray_cha;
    bitwise_not(gray, gray_cha);//颜色值取反,同下面算法一致,这个是通过位操作 与或非 实现的
    imshow("output2", gray_cha);
    int height = gray.rows;
    int width = gray.cols;
    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            int pixel = gray.at<uchar>(row, col);//读取图像中 row,col 位置的像素(颜色数据由单通道组成),所以 <> 中用uchar,只返回的是一个uchar值
            gray.at<uchar>(row, col) = 255 - pixel;//颜色值取反,灰度图的单通道也是一个字节大小,所以值在0-255之间
        }
    }
    imshow("output3", gray);

    Mat dst_cha;
    bitwise_not(src, dst_cha);//颜色值取反,同下面算法一致
    imshow("output4", dst_cha);
    Mat dst;
    dst.create(src.size(), src.type());
    height = src.rows;
    width = src.cols;
    int nc = src.channels();

    Mat convert;
    src.convertTo(convert, CV_32F);//把CV_8UC1(uchar)转换到CV32F1(float), Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。Vec3f对应三通道的float类型数据

    for (int row = 0; row < height; row++)
    {
        for (int col = 0; col < width; col++)
        {
            int b = src.at<Vec3b>(row, col)[0];//读取图像中 row,col 位置的像素(颜色数据由三通道组成),src是三通道的RGB,所以 <> 传的是Vec3b,返回的是长度3的uchar数组
            int g = src.at<Vec3b>(row, col)[1];
            int r = src.at<Vec3b>(row, col)[2];
            float f_b = convert.at<Vec3f>(row, col)[0];//Vec3f
            float f_g = convert.at<Vec3f>(row, col)[1];
            float f_r = convert.at<Vec3f>(row, col)[2];
            dst.at<Vec3b>(row, col)[0] = 255 - b;//颜色值取反,若分别将 b g r 通道颜色设为0,图片整体颜色为 偏黄、偏绯红、偏青 色
            dst.at<Vec3b>(row, col)[1] = 255 - g;
            dst.at<Vec3b>(row, col)[2] = 255 - r;

            gray.at<uchar>(row, col) = min(b, min(g, r));//随意设置的灰度图,取max图像会比取min亮
        }
    }
    imshow("output5", dst);
    imshow("output6", gray);

    waitKey(0);
}

结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_26907755/article/details/81666108