亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

OpenCV實現圖像腐蝕的方法

發布時間:2021-06-23 13:50:37 來源:億速云 閱讀:241 作者:chen 欄目:開發技術

本篇內容主要講解“OpenCV實現圖像腐蝕的方法”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“OpenCV實現圖像腐蝕的方法”吧!

圖像的腐蝕過程與圖像的卷積操作類似,都需要模板矩陣來控制運算的結果,在圖像的腐蝕和膨脹中這個模板矩陣被稱為結構元素。與圖像卷積相同,結構元素可以任意指定圖像的中心點,并且結構元素的尺寸和具體內容都可以根據需求自己定義。定義結構元素之后,將結構元素的中心點依次放到圖像中每一個非0元素處,如果此時結構元素內所有的元素所覆蓋的圖像像素值均不為0,則保留結構元素中心點對應的圖像像素,否則將刪除結構元素中心點對應的像素。圖像的腐蝕過程示意圖如圖6-12所示,圖6-12中左側為待腐蝕的原圖像,中間為結構元素,首先將結構元素的中心與原圖像中的A像素重合,此時結構元素中心點的左側和上方元素所覆蓋的圖像像素值均為0,因此需要將原圖像中的A像素刪除;當把結構元素的中心點與B像素重合時,此時結構元素中所有的元素所覆蓋的圖像像素值均為1,因此保留原圖像中的B像素。將結構元素中心點依次與原圖像中的每個像素重合,判斷每一個像素點是否保留或者刪除,最終原圖像腐蝕的結果如圖中右側圖像所示。

OpenCV實現圖像腐蝕的方法

圖像腐蝕可以用“Θ”表示,其數學表示形式如式(6.4)所示,通過公式可以發現,其實對圖像A的腐蝕運算就是尋找圖像中能夠將結構元素B全部包含的像素點。

OpenCV實現圖像腐蝕的方法

生成常用的矩形結構元素、十字結構元素和橢圓結構:

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
  • shape:結構元素的種類,可以選擇的參數及含義在表6-5中給出。

  • ksize:結構元素的尺寸大小

  • anchor:中心點的位置,默認參數為結構元素的幾何中心點。

該函數用于生成圖像形態學操作中常用的矩形結構元素、十字結構元素和橢圓結構元素。函數第一個參數為生成結構元素的種類,可以選擇的參數及含義在表給出,函數第二個參數是結構元素的尺寸大小,能夠影響到圖像腐蝕的效果,一般情況下,結構元素的種類相同時,結構元素的尺寸越大腐蝕效果越明顯。函數的最后一個參數是結構元素的中心點,只有十字結構元素的中心點位置會影響圖像腐蝕后的輪廓形狀,其他種類的結構元素的中心點位置只影響形態學操作結果的平移量。

OpenCV實現圖像腐蝕的方法

腐蝕函數

void erode( InputArray src, OutputArray dst, InputArray kernel,
                         Point anchor = Point(-1,-1), int iterations = 1,
                         int borderType = BORDER_CONSTANT,
                         const Scalar& borderValue = morphologyDefaultBorderValue() );
  • src:輸入的待腐蝕圖像,圖像的通道數可以是任意的,但是圖像的數據類型必須是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。

  • dst:腐蝕后的輸出圖像,與輸入圖像src具有相同的尺寸和數據類型。

  • kernel:用于腐蝕操作的結構元素,可以自己定義,也可以用getStructuringElement()函數生成。

  • anchor:中心點在結構元素中的位置,默認參數為結構元素的幾何中心點

  • iterations:腐蝕的次數,默認值為1。

  • borderType:像素外推法選擇標志,取值范圍在表3-5中給出。默認參數為BORDER_DEFAULT,表示不包含邊界值倒序填充。

  • borderValue:使用邊界不變外推法時的邊界值。

該函數根據結構元素對輸入圖像進行腐蝕,在腐蝕多通道圖像時每個通道獨立進行腐蝕運算。
函數的第一個參數為待腐蝕的圖像,圖像通道數可以是任意的,但是圖像的數據類型必須是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
函數第二個參數為腐蝕后的輸出圖像,與輸入圖像具有相同的尺寸和數據類型。
函數第三個和第四個參數都是與結構元素相關的參數,第三個參數為結構元素,第四個參數為結構元素的中心位置,第四個參數的默認值為Point(-1,-1),表示結構元素的幾何中心處為結構元素的中心點。
函數第五個參數是使用結構元素腐蝕的次數,腐蝕次數越多效果越明顯,參數默認值為1,表示只腐蝕1次。
函數第六個參數是圖像像素外推法的選擇標志,
第七個參數為使用邊界不變外推法時的邊界值,這兩個參數對圖像中主要部分的腐蝕操作沒有影響,因此在多數情況下使用默認值即可。

需要注意的是該函數的腐蝕過程只針對圖像中的非0像素,因此如果圖像是以0像素為背景,那么腐蝕操作后會看到圖像中的內容變得更瘦更小;如果圖像是以255像素為背景,那么腐蝕操作后會看到圖像中的內容變得更粗更大。

簡單示例

//
// Created by smallflyfly on 2021/6/18.
//
 
#include "opencv2/opencv.hpp"
 
#include <iostream>
 
using namespace std;
using namespace cv;
 
 
void drawResult(Mat im, int num, Mat stats, Mat centroids, const string& name) {
    for (int i = 1; i < num; ++i) {
        int x = centroids.at<double>(i, 0);
        int y = centroids.at<double>(i, 1);
        cout << x << " " << y << endl;
        circle(im, Point(x, y), 2, Scalar(0, 0, 255), -1);
        int xmin = stats.at<int>(i, CC_STAT_LEFT);
        int ymin = stats.at<int>(i, CC_STAT_TOP);
        int w = stats.at<int>(i, CC_STAT_WIDTH);
        int h = stats.at<int>(i, CC_STAT_HEIGHT);
 
        Rect rect(xmin, ymin, w, h);
        rectangle(im, rect, Scalar(255, 255, 255), 2);
        putText(im, to_string(i), Point(x+5, y), FONT_HERSHEY_SCRIPT_SIMPLEX, 0.3, Scalar(0, 0, 255), 1);
    }
    imshow(name, im);
}
 
 
int main() {
 
    Mat src = (
                Mat_<uchar>(6, 6) <<
                        0, 0, 0, 0, 255, 0,
                        0, 255, 255, 255, 255, 255,
                        0, 255, 255, 255, 255, 0,
                        0, 255, 255, 255, 255, 0,
                        0, 255, 255, 255, 255, 0,
                        0, 0, 0, 0, 255, 0
            );
    resize(src, src, Size(0, 0), 50, 50, INTER_NEAREST);
    Mat m1, m2;
    m1 = getStructuringElement(0, Size(3, 3));
    m2 = getStructuringElement(1, Size(3, 3));
 
    Mat erodeM1, erodeM2;
    erode(src, erodeM1, m1, Point(-1, -1), 10);
    erode(src, erodeM2, m2, Point(-1, -1), 10);
 
    imshow("src", src);
    imshow("erodeM1", erodeM1);
    imshow("erodeM2", erodeM2);
 
    Mat xbim = imread("xiaobai.jpg");
    Mat xbM1, xbM2;
    erode(xbim, xbM1, m1, Point(-1, -1), 2);
    erode(xbim, xbM2, m2, Point(-1, -1), 2);
 
    imshow("xb", xbim);
    imshow("xbM1", xbM1);
    imshow("xbM2", xbM2);
 
    Mat im = imread("rice.jfif");
    Mat im1 = im.clone();
    Mat im2 = im.clone();
    Mat im3 = im.clone();
 
    Mat gray;
    cvtColor(im, gray, CV_BGR2GRAY);
    Mat riceBin;
    threshold(gray, riceBin, 125, 255, THRESH_BINARY);
 
    Mat out, stats, centroids;
    int count1 = connectedComponentsWithStats(riceBin, out, stats, centroids, 8, CV_16U);
    drawResult(im1, count1, stats, centroids, "no erode");
 
    Mat erodeIm1, erodeIm2;
    erode(riceBin, erodeIm1, m1, Point(-1, -1), 5);
    erode(riceBin, erodeIm2, m2, Point(-1, -1), 5);
 
    int count2 = connectedComponentsWithStats(erodeIm1, out, stats, centroids, 8, CV_16U);
    drawResult(erodeIm1, count2, stats, centroids, "erode1");
    int count3 = connectedComponentsWithStats(erodeIm2, out, stats, centroids, 8, CV_16U);
    drawResult(erodeIm2, count3, stats, centroids, "erode2");
 
    waitKey(0);
    destroyAllWindows();
 
}

OpenCV實現圖像腐蝕的方法

到此,相信大家對“OpenCV實現圖像腐蝕的方法”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

泸定县| 许昌县| 安化县| 洱源县| 泽库县| 全州县| 凤山市| 腾冲县| 纳雍县| 常山县| 平谷区| 石首市| 伊通| 绍兴县| 久治县| 黄冈市| 沙坪坝区| 长春市| 射洪县| 康乐县| 湘潭县| 瑞丽市| 洛扎县| 彰化县| 花莲市| 环江| 富顺县| 茂名市| 红安县| 三亚市| 洛南县| 马龙县| 仁化县| 虞城县| 定南县| 广德县| 英吉沙县| 奎屯市| 原平市| 治多县| 古田县|