图像处理和OpenCV初步

图像从数学和计算机的角度理解就是一个矩阵,矩阵中的每一个元素叫做像素,又由于图像有灰度图像和彩色图像之分,所以图像在矩阵的基础上引入通道(channel),其中色彩用数字来表示的时候,规定数字0表示黑色,数字255表示白色。

OpenCV角度来看图像

OpenCV中的cv::Mat类就是用来表示图像的矩阵而存在的,其中cv::Mat类由头部数据块组成。

  • 头部包含了矩阵的所有相关信息(大小、通道数量、数据类型等),cv::Mat 头部文件的某些属性(例如cols、rows 或 channels)。头部有一个指向 数据块的指针,即 data 属性。
  • 数据块包含了图像中所有像素的值。

cv::Mat有一个很重要的属性,即只有在明确要求时,内存块才 会被复制。实际上,大多数操作仅仅复制了cv::Mat的头部,因此多个对象会指向同一个数据块。这种内存管理模式可以提高应用程序的运行效率,避免内存泄漏,


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

#include <opencv2/highgui.hpp>

// 测试函数,它创建一幅图像
cv::Mat function() {
    // 创建图像
     cv::Mat ima(500,500,CV_8U,50);
     // 返回图像
      return ima;
}

int main() {

    // // 创建一个 240 行×320 列的新图像
    cv::Mat image1(240,320,CV_8U,100);
    // or:
    // cv::Mat image1(240,320,CV_8U,cv::Scalar(100));

    cv::imshow("Image", image1); // show the image
    cv::waitKey(0); // wait for a key pressed

    // 重新分配一个新图像
    // (only if size or type are different)
    image1.create(200,200,CV_8U);
    image1= 200;

    cv::imshow("Image", image1); // show the image
    cv::waitKey(0); // wait for a key pressed

    // create a red color image
    // channel order is BGR
    cv::Mat image2(240,320,CV_8UC3,cv::Scalar(0,0,255));

    // or:
    // cv::Mat image2(cv::Size(320,240),CV_8UC3);
    // image2= cv::Scalar(0,0,255);

    cv::imshow("Image", image2); // show the image
    cv::waitKey(0); // wait for a key pressed

    // read an image
    cv::Mat image3=  cv::imread("puppy.bmp");

    // all these images point to the same data block
    cv::Mat image4(image3);
    image1= image3;

    // these images are new copies of the source image
    image3.copyTo(image2);
    cv::Mat image5= image3.clone();

    // transform the image for testing
    cv::flip(image3,image3,1);

    // check which images have been affected by the processing
    cv::imshow("Image 3", image3);
    cv::imshow("Image 1", image1);
    cv::imshow("Image 2", image2);
    cv::imshow("Image 4", image4);
    cv::imshow("Image 5", image5);
    cv::waitKey(0); // wait for a key pressed

    // 从函数中获取一个灰度图像
    cv::Mat gray= function();

    cv::imshow("Image", gray); // show the image
    cv::waitKey(0); // wait for a key pressed

    // 作为灰度图像读入
    image1=  cv::imread("puppy.bmp", CV_LOAD_IMAGE_GRAYSCALE);

    // convert the image into a floating point image [0,1]
    image1.convertTo(image2,CV_32F,1/255.0,0.0);

    cv::imshow("Image", image2); // show the image

    // Test cv::Matx
    // a 3x3 matrix of double-precision
    cv::Matx33d matrix(3.0, 2.0, 1.0,
                       2.0, 1.0, 3.0,
                       1.0, 2.0, 3.0);
    // a 3x1 matrix (a vector)
    cv::Matx31d vector(5.0, 1.0, 3.0);
    // multiplication
    cv::Matx31d result = matrix*vector;

    std::cout << result;

    cv::waitKey(0); // wait for a key pressed
    return 0;
}

灰度图像

一个通道的图像就是灰度图像,就是类似以前的老照片,不是彩色的,也可以理解成黑白的。

  • OpenCV中对灰度图像的处理
// 作为灰度图像读入
image1=  cv::imread("puppy.bmp", CV_LOAD_IMAGE_GRAYSCALE);
// 创建灰度图像
 cv::Mat ima(500,500,CV_8U,50);
//0表示灰度图像
cv::Mat image2= cv::imread("boldt.jpg",0);//0表示灰度图

彩色图像

对彩色图像而言,需要用三原色数据来重现不同的可见色。

这是因为人类的视觉系统是三原色的,视网膜上有三种类型的视锥细胞,它们将颜色信息传递给大脑。

所以彩色图像的每个像素都要对应三个数值。在摄影和数字成像技术中,常用的主颜色通道是红色、绿色和蓝色,因此每三个 8 位数值组成矩阵的一个元素,特别说明,8 位通道通常是够用的,但有些特殊的应用程序需要用 16 位通道(医学图像就是用16位通道表示)。

  • OpenCV对图像的读入
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>

int main()
{
    // open the image
    cv::Mat image= cv::imread("boldt.jpg",1);

    // display result
    cv::namedWindow("Image1");
    cv::imshow("Image1",image);

    // write on disk
    cv::imwrite("salted.bmp",image);

    cv::waitKey();

    // test second version
    cv::Mat image2= cv::imread("boldt.jpg",0);//0表示灰度图

    cv::namedWindow("Image2");
    cv::imshow("Image2",image2);

    cv::waitKey();

    return 0;
}

原文地址:https://www.cnblogs.com/GeekHuman/p/9901519.html

时间: 2024-10-29 05:09:15

图像处理和OpenCV初步的相关文章

[Python]网络爬虫(三):异常的处理和HTTP状态码的分类(转)

先来说一说HTTP的异常处理问题.当urlopen不能够处理一个response时,产生urlError.不过通常的Python APIs异常如ValueError,TypeError等也会同时产生.HTTPError是urlError的子类,通常在特定HTTP URLs中产生. 1.URLError通常,URLError在没有网络连接(没有路由到特定服务器),或者服务器不存在的情况下产生. 这种情况下,异常同样会带有"reason"属性,它是一个tuple(可以理解为不可变的数组),

C预处理和C库

1 #include <stdio.h> 2 #define MAN(x) "n"##x 3 int main(void) 4 { 5 printf("%s",MAN("dd")); 6 return 0; 7 } 这里我说一下,几个我曾犯的错误,首先,将#define错写成了#include 报错error C2006: #include expected a filename, found 'identifier' 当我搜索时发现

图像处理中mask

转自 http://blog.csdn.net/meng4411yu/article/details/10033325 1.掩膜的定义 掩模是由0和1组成的一个二进制图像.当在某一功能中应用掩模时,1值区域被处理,被屏蔽的0值区域不被包括在计算中.通过指定的数据值.数据范围.有限或无限值.感兴趣区和注释文件来定义图像掩模,也可以应用上述选项的任意组合作为输入来建立掩模.(来自百度百科http://baike.baidu.com/view/2062299.htm#2) 2.图像掩膜例子 图1 掩膜

图像处理中Stride的理解

一行有 11 个像素(Width = 11), 对一个 32 位(每个像素 4 字节)的图像, Stride = 11 * 4 = 44. 但还有个字节对齐的问题, 譬如: 一行有 11 个像素(Width = 11), 对一个 24 位(每个像素 3 字节)的图像, Stride = 11 * 3 + 3 = 36. 为什么不是 Stride = 33? 因为它是按 4 字节对齐的. 根据上面道理, 我们可以手动计算 Stride 的值: 1.Stride = 每像素占用的字节数(也就是像素位

图像处理中Stride和Width的关系

一行有 11 个像素(Width = 11), 对一个 32 位(每个像素 4 字节)的图像, Stride = 11 * 4 = 44. 但还有个字节对齐的问题, 譬如: 一行有 11 个像素(Width = 11), 对一个 24 位(每个像素 3 字节)的图像, Stride = 11 * 3 + 3 = 36. 为什么不是 Stride = 33? 因为它是按 4 字节对齐的. 根据上面道理, 我们可以手动计算 Stride 的值: 1.Stride = 每像素占用的字节数(也就是像素位

安卓里面JSON处理和JAVA SE里面的JSON包

今天编译安卓项目遇到这个问题 com.android.dex.DexException: Multiple dex files define的解决办法 大致意思就是引用了 相同的包 在JAVA SE里面我使用的是 import net.sf.json.JSONObject; 这个就不多说了,网上大家都可以下载到,但是当吧这个jar放到安卓里就出现引用相同的包的问题了 看了下android.jar 里面有个org.json 一样可以处理 问题解决

Spark2 文件处理和jar包执行

上传数据文件 mkdir -p data/ml/ /home/wangxiao/data/ml/Affairs.txt hadoop fs -mkdir -p /datafile/wangxiao/ hadoop fs -ls / hadoop fs -put /home/wangxiao/data/ml/Affairs.txt /datafile/wangxiao/ hadoop fs -ls -R /datafile hdfs://ns1/datafile/wangxiao/Affairs.

XML 特殊字符处理和 CDATA

在处理XML数据时,特殊字符要特殊处理,不能和节点字符混淆. 所有 XML 文档中的文本均会被解析器解析. 只有 CDATA 区段(CDATA section)中的文本会被解析器忽略. PCDATA PCDATA 指的是被解析的字符数据(Parsed Character Data). XML 解析器通常会解析 XML 文档中所有的文本. 当某个 XML 元素被解析时,其标签之间的文本也会被解析: <message>此文本也会被解析</message> 解析器之所以这么做是因为 XM

jQuery-1.9.1源码分析系列(十六)ajax——响应数据处理和api整理

ajax在得到请求响应后主要会做两个处理:获取响应数据和使用类型转化器转化数据 a.获取响应数据 获取响应数据是调用ajaxHandleResponses函数来处理. ajaxHandleResponses的功能有: - 为jqXHR设置所有responseXXX字段(值便是响应数据) - 找到正确的dataType (在content-type和预期的dataType两者中的一个) - 返回正确的响应数据 我们看一个响应数据的格式: responses = { text: "{"co