Manipulating the Pixels

参考:https://blog.csdn.net/lu597203933/article/details/16359461

为了构建计算机视觉应用程序,您必须能够访问图像内容,并最终修改或创建图像。即使是很简单的一副图像也可能包含数万个像素。从根本上说,图像是数值矩阵。这就是OpenCV 使用cv::Mat数据结构操作它们的原因。矩阵的每个元素代表一个像素。对于灰度图像(“黑白”图像),像素是无符号的8位值,其中0对应于黑色,55对应于白色。对于彩色图像,每个像素需要三个这样的值来表示通常的三原色通道{红色,绿色,蓝色}。因此,在这种情况下,矩阵元素具有三个值。

为了访问矩阵的每个单独元素,您只需指定其行号和列号。将返回逻辑上的像素。为啥是逻辑上的像素,因为对于灰度图,这个像素就是一个无符号数值。对于多通道图,这个像素就是一个向量。

#include "cv.h"
#include "highgui.h"

void salt(cv::Mat &image, int n) {
    for (int k = 0; k<n; k++) {
        int i = rand() % image.cols;
        int j = rand() % image.rows;
        if (image.channels() == 1) { // gray-level image
            image.at<uchar>(j, i) = 255;
        }
        else if (image.channels() == 3) { // color image
            image.at<cv::Vec3b>(j, i)[0] = 255;
            image.at<cv::Vec3b>(j, i)[1] = 255;
            image.at<cv::Vec3b>(j, i)[2] = 255;
        }
    }
}

int main(int argc, char** argv)
{
    cv::Mat image = cv::imread("man.jpg");
    salt(image, 3000);
    cv::namedWindow("Image");
    cv::imshow("Image", image);
    cvWaitKey(0);
    return 0;
}

椒盐噪点:是一种特殊类型的噪声,其中一些像素被白色或黑色像素取代。当在传输期间丢失某些像素的值时,这种类型的噪声可能发生在错误的通信中。

类cv::Mat包含几种访问图像不同属性的方法。
公共成员变量cols和rows为您提供图像中的列数和行数。对于元素访问,cv::Mat使用方法at(int y, int x)。但是,at方法返回的类型必须在编译时已知,并且由于cv::Mat可以包含任何类型的元素,因此程序员需要指定预期的返回类型。确定返回类型是程序员的责任 ,at方法不做任何类型转换。

图像由像素组成,对于灰度图是8位无符号数,对于彩色图是一个向量。image是cv::Mat类型

image.at<uchar>(j,i)= 255;
image.at<cv::Vec3b>(j,i)[channel]= value;

<>内是各种类型的缩写,常见缩写如下Vec<T,n>  T代表类型,n代表通道数

typedef Vec<uchar, 2> Vec2b;
typedef Vec<uchar, 3> Vec3b;
typedef Vec<uchar, 4> Vec4b;

typedef Vec<short, 2> Vec2s;
typedef Vec<short, 3> Vec3s;
typedef Vec<short, 4> Vec4s;

typedef Vec<ushort, 2> Vec2w;
typedef Vec<ushort, 3> Vec3w;
typedef Vec<ushort, 4> Vec4w;

typedef Vec<int, 2> Vec2i;
typedef Vec<int, 3> Vec3i;
typedef Vec<int, 4> Vec4i;
typedef Vec<int, 6> Vec6i;
typedef Vec<int, 8> Vec8i;

typedef Vec<float, 2> Vec2f;
typedef Vec<float, 3> Vec3f;
typedef Vec<float, 4> Vec4f;
typedef Vec<float, 6> Vec6f;

typedef Vec<double, 2> Vec2d;
typedef Vec<double, 3> Vec3d;
typedef Vec<double, 4> Vec4d;
typedef Vec<double, 6> Vec6d;

前面,cv::Mat的对象在使用at方法访问像素的时候,需要指定返回类型。在已知矩阵类型的情况下,可以使用cv::Mat_类。他是cv::Mat的模板子类,cv::Mat_定义了一些额外的方法,但是没有思想你的数据类型。其使用方法如下

cv::Mat_<uchar> im2= image; // im2 refers to image
im2(50,100)= 0; // access to row 50 and column 100

cv::Mat_对象在声明的时候就已经制定了类型,所以在使用st的方法的时候不需要指定返回类型。

https://blog.csdn.net/keetsky/article/details/52933908

猜你喜欢

转载自www.cnblogs.com/kelamoyujuzhen/p/9269306.html
今日推荐