圖像處理和OpenCV初步
阿新 • • 發佈:2018-11-03
named 彩色圖像 cti read 包含 通道數 內存管理 only 數字 有一個很重要的屬性,即只有在明確要求時,內存塊才 會被復制。實際上,大多數操作僅僅復制了
圖像從數學和計算機的角度理解就是一個矩陣
,矩陣中的每一個元素叫做像素
,又由於圖像有灰度圖像和彩色圖像之分,所以圖像在矩陣的基礎上引入通道(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;
}
圖像處理和OpenCV初步