環境
VS2019
opencv4.4.0
參考:連結
初步嘗試
參考:連結
影像顯示
#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; int main() { //讀取圖片 Mat img = imread("D:\\生活資料\\圖片\\鬥圖\\1.jpg", 1); //圖片儲存位置地址使用 if (img.empty()) { std::cout << "圖片讀取失敗!" << std::endl; system("pause"); return 0; } imshow("【原圖】", img); //顯示原圖片 waitKey(); // 等待任意按鍵按下 return 0; }
顯示效果:
程式碼解釋:
1、using namespace cv;
opencv 中的C++類和函式都是定義在名稱空間cv之內的,在程式碼開頭的適當位置加上 using namespace cv; ,規定程式位於此名稱空間之內
2、Mat類
mat 類用於儲存影像以及其他矩陣資料的資料結構,我們這裡只是用到了 Mat img=imread();
3、imread()
imread() 函式用於讀取檔案中的圖片到opencv中,定義如下:
Mat imread( const String& filename, int flags = IMREAD_COLOR );
第一個引數 const String& filename ,指的是圖片路徑,在Windows下,opencv的imread函式支援如下型別的影像載入:
第二個引數: int flags = IMREAD_COLOR ,為載入表示,指定了一個載入影像的顏色型別,其他不多介紹
4、imshow()
imshow()函式用於在指定的敞口中顯示衣服影像,函式定義為:
void imshow(const String& winname, InputArray mat);
第一個引數:const String& winname,只要顯示的視窗顯示名稱
第二個引數:InputArray mat,只要顯示的影像,其他不多介紹
圖形腐蝕和膨脹
腐蝕:就是影像中暗色部分“腐蝕”掉影像中的高亮部分
程式碼:
#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; int main() { //讀取圖片 Mat img = imread("D:\\生活資料\\圖片\\鬥圖\\1.jpg", 1); //圖片儲存位置地址使用 \\ if (img.empty()) { std::cout << "圖片讀取失敗!" << std::endl; system("pause"); return 0; } imshow("【原圖】", img); //顯示原圖片 //進行腐蝕操作 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); Mat dstimg; erode(img, dstimg, element); //顯示效果圖 imshow("【腐蝕操作】", dstimg); waitKey(); // 等待任意按鍵按下 return 0; }
效果:
程式碼解釋:
參考:連結
1、getStructuringElement
getStructuringElement()函式,返回值為指定形狀和尺寸結構元素(核心矩陣),定義如下:
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
第一個引數:核心的形狀(一般來說:矩形:MORPH_RECT;交叉形:MORPH_CROSS;橢圓形:MORPH_ELLIPSE)
第二個引數:核心大小(如上,就是15*15的正方行核心)
第三個引數:錨點的位置(預設值Point(-1,-1),表示錨點位於中心點)
2、erode
erode 函式使用畫素鄰域內的區域性極小運算子來腐蝕一張圖片,從src輸入,由dst輸出,定義如下:
void erode(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue()
);
第一個引數:輸入影像,即源影像,填Mat類的物件即可
第二個引數:目標影像,需要有原影像有一樣的尺寸和型別
第三個引數:kernel,腐蝕操作的核心,為NULL時,表示的是使用參考點位於中心3*3的核,一般使用 getStructuringElement 函式,會返回指定形狀和尺寸的結構元素(核心矩陣)
第四個引數:anchor,錨的位置,預設為(-1,-1),表示錨位於單位(element)的中心
第五個引數:iterations ,迭代使用erode函式的次數,預設為1
第六個引數:borderType ,用於推斷影像外部畫素的某種邊界模式,預設為BORDER_CONSTANT
第七個引數:borderValue,當邊界為常數時的邊界值,有預設值 morphologyDefaultBorderValue ,其他不多解釋
但使用erode函式,一般只需要前三個引數,後面四個引數都是預設值
膨脹:和腐蝕相反,將影像亮度部分放大,黑暗部分縮小
程式碼:
#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; int main() { //讀取圖片 Mat img = imread("D:\\生活資料\\圖片\\鬥圖\\1.jpg", 1); //圖片儲存位置地址使用 \\ if (img.empty()) { std::cout << "圖片讀取失敗!" << std::endl; system("pause"); return 0; } imshow("【原圖】", img); //顯示原圖片 //進行腐蝕操作 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); Mat dstimg; dilate(img, dstimg, element); //顯示效果圖 imshow("【膨脹操作】", dstimg); waitKey(); // 等待任意按鍵按下 return 0; }
效果:
程式碼分析:
1、dilate
dilate 函式使用畫素鄰域內的區域性極大運算子來膨脹一張圖片,從src輸入,由dst輸出,函式定義為:
void dilate(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue()
);
引數介紹:
影像模糊
模糊,就是對影像進行了增值濾波操作
程式碼:
#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; int main() { //讀取圖片 Mat img = imread("D:\\生活資料\\圖片\\鬥圖\\1.jpg", 1); //圖片儲存位置地址使用 \\ if (img.empty()) { std::cout << "圖片讀取失敗!" << std::endl; system("pause"); return 0; } imshow("【原圖】", img); //顯示原圖 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); Mat dstimg; // 進行腐蝕操作 erode(img, dstimg, element); imshow("【腐蝕操作】", dstimg); // 進行膨脹操作 dilate(img, dstimg, element); imshow("【膨脹操作】", dstimg); // 進行模糊操作 blur(img, dstimg, Size(7, 7)); imshow("【均值濾波】", dstimg); waitKey(); // 等待任意按鍵按下 return 0; }
效果: