1. 程式人生 > >閾值,邊緣檢測

閾值,邊緣檢測

#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;

}