閾值,邊緣檢測
阿新 • • 發佈:2018-11-17
#include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> #include <iostream> using namespace cv; using namespace std; #define PATH "/Users/mac/ClionProjects/opencv_test/" // 濾波: 以高斯濾波為例,低通是模糊(邊緣不明顯),高通是銳化(強調邊緣和噪音) // 膨脹和腐蝕都是相對於高亮區域, 膨脹dilate是擴充套件高亮區域,腐蝕是縮小 // 膨脹用核周圍最大值代替核中心, 腐蝕用核周圍最小值代替 // 高斯金字塔:高斯核卷積後池化 層層降取樣 // 拉普拉斯金字塔: // 一般值為-1或者Size()為預設型別 // 自適應閾值:根據臨近畫素值決定閾值大小(而不是全域性固定一個閾值),但是二值化後的值仍是全域性一致的 int main() { // Mat src = imread(PATH"home.jpg"); cvtColor(src, src, COLOR_BGR2GRAY); Mat dstImg; threshold(src, dstImg, 50, 200, THRESH_BINARY ); adaptiveThreshold(src, dstImg, 150, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 5, 0); imshow("ans", dstImg); waitKey(0); return 0; }
邊緣檢測(canny)
#include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/core/core.hpp> #include <iostream> using namespace cv; using namespace std; #define PATH "/Users/mac/ClionProjects/opencv_test/" /** Cannya檢測: 1.高斯濾波消除噪聲 2.計算梯度和方向,利用sobel運算元計算x,y方向梯度,合成後有幅值和方向,方向背量化為0,45,90,135 3.非極大值抑制,消除非邊緣畫素 4.滯後閾值(雙閾值) 高過高閾值則保留為邊緣畫素 低於低閾值則被排除 處於中間的若連線至高閾值畫素時保留 */ int main() { // Mat src = imread(PATH"home.jpg"); Mat dstImg, grayImg,edge; // threshold(src, dstImg, 50, 200, THRESH_BINARY ); // adaptiveThreshold(src, dstImg, 150, ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY, 5, 0); //高階用法:邊緣作為掩碼拷貝至原圖, dstImg.create(src.size(), src.type()); cvtColor(src, grayImg, COLOR_BGR2GRAY); Canny(grayImg, edge, 100, 150 ); dstImg = Scalar::all(0); src.copyTo(dstImg, edge); imshow("as", dstImg); waitKey(0); return 0; }