图像处理和OpenCV初步

发布日期:2019-03-14

图像从数学和计算机的角度理解就是一个矩阵,矩阵中的每一个元素叫做像素,又由于图像有灰度图像和彩色图像之分,所以图像在矩阵的基础上引入通道(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(500500CV_8U50) // 返回图像 return ima}int main() { // // 创建一个 240 行×320 列的新图像 cv::Mat image1(240320CV_8U100) // or: // cv::Mat image1(240320CV_8Ucv::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(200200CV_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(240320CV_8UC3cv::Scalar(00255)) // or: // cv::Mat image2(cv::Size(320240)CV_8UC3) // image2= cv::Scalar(00255) 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(image3image31) // 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 [01] image1.convertTo(image2CV_32F1/255.00.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(500500CV_8U50)//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}