OpenCV基础(二)---图像像素操作

图像像素操作

通过访问图像的像素,对灰度图像和RGB图像进行反差.

例如,在灰度图像中,某一个像素值为,pixel_value. 那么反差后的pixel_value = 255 - pixel_value.

对RGB图像处理类似,差别在于要对每一个颜色通道进行反差.

方法1:

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3
 4 using namespace cv;
 5 using namespace std;
 6
 7 const char* input_title = "input image";
 8 const char* output_title = "output image";
 9
10 int main() {
11
12     /*加载并显示图像*/
13     Mat src;
14     src = imread("D:/lena.png");
15     if (src.empty()) {  //图像如果没有加载,结束程序
16         cout << "could not found image...";
17         return -1;
18     }
19     namedWindow(input_title, CV_WINDOW_AUTOSIZE); //创建窗口
20     imshow(input_title, src); //显示原始图像
21
22
23     Mat dst;
24     int channels = src.channels();  //获取原图像通道数
25     int height = src.rows;            //获取原图像高度
26     int width = src.cols;            //获取原图像宽度
27     dst.create(src.size(), src.type());  //依照原图像,创建目的图像
28
29     /*访问图像像素,并实现反差图像*/
30     for (int row = 0; row < height; row++)
31         for (int col = 0; col < width; col++) {
32             if (channels == 1)
33             {
34                 int gray = src.at<uchar>(row, col);  //获取通道的像素值
35                 dst.at<uchar>(row, col) = 255 - gray; //像素反差
36             }
37             else if (channels == 3)
38             {
39                 int b = src.at<Vec3b>(row, col)[0];  //获取blue通道像素值
40                 int g = src.at<Vec3b>(row, col)[1];     //获取green通道像素值
41                 int r = src.at<Vec3b>(row, col)[2];     //获取red通道像素值
42                 dst.at<Vec3b>(row,col)[0] = 255 - b;
43                 dst.at<Vec3b>(row, col)[1] = 255 - g;  //像素反差
44                 dst.at<Vec3b>(row, col)[2] = 255 - r;
45             }
46         }
47
48     /*显示结果*/
49     namedWindow(output_title, CV_WINDOW_AUTOSIZE);
50     imshow(output_title, dst);
51
52     waitKey(0);
53     return 0;
54 }

方法2:

调用函数 bitwise_not()

函数功能:计算两个数组或数组与标量之间的每个元素的绝对差.

函数原型:void bitwise_not(InputArray src, OutputArray dst,

     InputArray mask = noArray());

这个函数和前面的代码功能是一样的,

代码演示如下.

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

const char* input_title = "input image";
const char* output_title = "output image";

int main() {

    /*加载并显示图像*/
    Mat src;
    src = imread("D:/lena.png");
    if (src.empty()) {  //图像如果没有加载,结束程序
        cout << "could not found image...";
        return -1;
    }
    namedWindow(input_title, CV_WINDOW_AUTOSIZE); //创建窗口
    imshow(input_title, src); //显示原始图像

    /*图像反差*/
    Mat dst;
    bitwise_not(src, dst);

    /*显示结果*/
    namedWindow(output_title, CV_WINDOW_AUTOSIZE);
    imshow(output_title, dst);

    waitKey(0);
    return 0;
}

效果图:

原文地址:https://www.cnblogs.com/zmm1996/p/10661294.html

时间: 2024-07-30 01:30:39

OpenCV基础(二)---图像像素操作的相关文章

OpenCV 基础知识------图像创建、访问、转换

cvCreateImage函数-- Cxcore数组操作 创建头并分配数据 IplImage* cvCreateImage( CvSize size, int depth, int channels ); size 图像宽.高. depth 图像元素的位深度,可以是下面的其中之一: IPL_DEPTH_8U - 无符号8位整型 IPL_DEPTH_8S - 有符号8位整型 IPL_DEPTH_16U - 无符号16位整型 IPL_DEPTH_16S - 有符号16位整型 IPL_DEPTH_32

opencv高效访问图像像素(遍历像素的方法总结)

一.Accessingpixel values访问像素值.(用类自带的方法:方便,但效率不高) 1.      cv::Mat has the a templatemethod at(int y, int x) 用法image.at<cv::Vec3b>(j,i)[channel]= value; 注意事项:the programmer needs to specify the return type that is expected(需认为指定返回值类型),一般使用type cv::Vec3

OpenCV基础(六)---图像滤波

图像滤波 对图像进行单个像素操作,主要是进行对比度和阈值处理 而图像滤波在像素邻域间进行,一来达到我们希望的效果,二来进一步进行图像特征提取 滤波分为空间域和频域滤波,空间域滤波又分线性.非线性滤波 常用的线性滤波有,均值滤波,高斯滤波:非线性滤波有中值滤波,双边滤波 线性滤波 均值模糊:blur() void blur( InputArray src, OutputArray dst, Size ksize, Point anchor = Point(-1,-1), int borderTyp

opencv之访问图像像素

访问像素的三种方法 ①指针访问:最快 ②迭代器iterator:较慢,非常安全,指针访问可能出现越界问题 ③动态地址计算:更慢,通过at()实现.适用于访问具体某个第i行,j列的像素,而不适用遍历像素 Mat在内存中存储形式 灰度图的存储形式 RGB的存储形式 一般情况下,Mat是连续存储的,按行连接.可以通过isContinuous()函数,判断矩阵是否连续存储,若连续返回true. 访问像素的三种方法 1.指针访问 1 void VisitImgByPointer(Mat &inputImg

【opencv基础】图像的几何变换

参考 1. 图像的几何变换-平移和镜像: 2.图像的几何变换-缩放和旋转:. 完 原文地址:https://www.cnblogs.com/happyamyhope/p/10242546.html

Android Bitmap 加载与像素操作

Android Bitmap 加载与像素操作 一:加载与像素读写 在Android SDK中,图像的像素读写可以通过getPixel与setPixel两个Bitmap的API实现.Bitmap API读取像素的代码如下: int pixel = bitmap.getPixel(col, row);// ARGB int red = Color.red(pixel); // same as (pixel >> 16) &0xff int green = Color.green(pixel

Opencv中图像的遍历与像素操作

Opencv中图像的遍历与像素操作 OpenCV中表示图像的数据结构是cv::Mat,Mat对象本质上是一个由数值组成的矩阵.矩阵的每一个元素代表一个像素,对于灰度图像,像素是由8位无符号数来表示(0代表黑,255代表白):对于彩色图像,每个像素是一个三元向量,即由三个8位无符号数来表示三个颜色通道(Opencv中顺次为蓝.绿.红). 我们先来介绍下cv::Mat类的获取像素的成员函数at(),其函数原型如下: template<typename _Tp> _Tp& at(int i0

什么是图像 -- opencv基础

opencv基础篇--到底什么是图像 什么是图像?英语中有两个单词来形容图像,一个是picture,一个是image.这两者虽然是形容同一个东西,但却又有着区别.picture代表实而有物的真实图像:而image代表着计算机中存储的图像,也代表想象中的图像. 而我们更多研究的便是image,计算机图像从广义地可分为矢量图和像素图(位图).矢量图,是由一系列计算机指令描述和记录的一幅图,一幅图可以解为一系列由点.线.面等组成的子图.像素图,则是由很多个点组成的,每个点都是由二进制数据来描述和存储其

图像像素的获取和操作(第三天)

图像处理顾名思义就是对图像的像素进行操作,这是核心基础! 有三种方法对图像的操作:(图像像素的获取参差在其中) 第一种:使用指针进行操作 这个指针在上一篇博文中已经提到,这节博文进行加深理解. 先讲解opencv的指针应用: 1 Mat image = cv::Mat(400, 600, CV_8UC3); //宽400,长600,3通道彩色图片 rows=400,cols=600 2 uchar * data000 = image.ptr<uchar>(0);//第一行第一个元素地址 3 u