美文网首页
OpenCV:四、图像的基础操作

OpenCV:四、图像的基础操作

作者: 马洪滔 | 来源:发表于2020-08-22 12:21 被阅读0次

前言

在上一章中描述了如何使用自己实现掩膜运算以及调用cv :: filter2D函数对图像进行掩膜运算矩阵的掩膜运算

目标

本章中,将学习如何:

  • 读写像素
  • 修改像素值
  • 计算反差图像

读写像素

  • 在OpenCV中图像存储基本为Mat格式,如果我们想要获取GRAY图的像素点灰度值,可以通过img.at<uchar>(i,j)的方式轻松获取:
Scalar gray = img.at<uchar>(i,j) 或者 Scalar intensity = img.at<uchar>(Point(j,i))
  • 其中有一个要注意的地方是i对应的是点y的坐标,j对应的是点的x坐标,所以建议在访问时都用img.at<uchar>(Point(j,i))这种形式访问,免去了点坐标和行列的转换。对于获取RGB图像的像素点的像素值则可以使用如下方法,来分别获取B、G、R三个通道的对应的值:
Vec3f rgb = img.at<Vec3f>(i,j) 或者 Vec3f rgb = img.at<Vec3f>(Point(j,i)) 
float blue = bgr.val[0];
float green = bgr.val[1];
float red = bgr.val[2];

修改像素值

  • 修改灰度图像
img.at<uchar>(Point(j,i)) = 128;
  • 修改RGB三通道图像
img.at<Vec3f>(Point(j,i)) [0] = 128; //blue
img.at<Vec3f>(Point(j,i)) [1] = 128; //green
img.at<Vec3f>(Point(j,i)) [2] = 128; //red
  • 空白图像赋值
img = Scalar(0)
  • ROI选择
Rect r(10,10,100,100);
Mat roiImg = img(r);

源代码

#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
        Mat grayImage;
    src = imread("../data/HappyFish.jpg", IMREAD_UNCHANGED);
    if (src.empty())
    {
        printf("Could not find the image!\n");
        return -1;
    }
    namedWindow("input", WINDOW_NORMAL);
    imshow("input", src);
    cvtColor(src, grayImage, COLOR_BGR2GRAY);
    namedWindow("gray", WINDOW_NORMAL);
    imshow("gray", grayImage);
    int rows = grayImage.rows;
    int cols = grayImage.cols;
    dst = Mat(grayImage.size(), grayImage.type());  // 示例对象
    // 反差图像
       dst.create(src.size(), src.type());
    int rows = src.rows;
    int cols = src.cols;
    int chls = src.channels();
    for (int row = 0; row < rows; row++)
    {
        for (int col = 0; col < cols; col++)
        {
            if (chls == 1)
            {
                int gray = grayImage.at<uchar>(row, col);
                dst.at<uchar>(row, col) = 255 - gray;
            }
            else if (chls == 3)
            {
                int b = src.at<Vec3b>(row, col)[0];
                int g = src.at<Vec3b>(row, col)[1];
                int r = src.at<Vec3b>(row, col)[2];
                dst.at<Vec3b>(row, col)[0] = 255 - b;
                dst.at<Vec3b>(row, col)[1] = 255 - g;
                dst.at<Vec3b>(row, col)[2] = 255 - r;
            }

        }
    }
       // 按位取反,和上述功能一致
    bitwise_not(src, dst);
    namedWindow("output", WINDOW_NORMAL);
    imshow("output", dst);
    waitKey(0); // Wait for a keystroke in the window
        return 0;
    }

说明

  • Vec3b与Vec3f
    • Vec3b对应图像的三通道顺序是B、G、R的uchar类型数据。
    • Vec3f对应图像的三通道为Float类型的数据
    • 通过src.convertTo(dst,CV_32F)可以把CV_8UC1转到CV32F1类型

相关文章

  • OpenCV:四、图像的基础操作

    前言 在上一章中描述了如何使用自己实现掩膜运算以及调用cv :: filter2D函数对图像进行掩膜运算矩阵的掩膜...

  • Opencv图像基础操作

    图像基础操作 图像在numpy.ndarray中的结构首先我们需要创建一幅2×2的3颜色通道图像: 其中在蓝通道B...

  • Opencv图像操作

    从文件读取/写入图像,访问像素,原始操作,可视化图像 输入/输出 从文件中加载图像: 把自定义读入的彩色照片变成灰...

  • 使用Numpy和Opencv完成图像的基本数据分析(Part I

    摘要: 使用Numpy和Opencv完成图像的基本数据分析第四部分,主要包含阈值法、边缘检测、线型检测等操作 图像...

  • openCV

    Opencv2图像裁剪(子图像提取) opencv之读取图像 #######opencv读取图像的灰度值并显示出来...

  • 1.6 openCV-python 图像的基础操作

    图像的基础操作 获取像素值并修改 获取图像的属性 图像的ROI() 图像通道的拆分与合并

  • 模糊图像——线性滤波

      模糊图像是opencv常见的操作,使用模糊操作的原因是为了给图像预处理时降低噪声影响,Smooth和Blur是...

  • demo01

    图像处理基本操作 1. 读取图像 opencv提供了imread函数来读取图像,该函数有两个参数,filepath...

  • iOS OpenCV 图像灰度处理

    iOS OpenCV 图像灰度处理 iOS OpenCV 图像灰度处理

  • OpenCV(C++)操作像素总结

    OpenCV中提供了许多操作图像的函数,但是有时候我们需要直接操作像素来实现我们的功能,这篇文章总结了OpenCV...

网友评论

      本文标题:OpenCV:四、图像的基础操作

      本文链接:https://www.haomeiwen.com/subject/qizgdktx.html