欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

OpenCV實(shí)現(xiàn)圖像腐蝕

 更新時(shí)間:2021年06月23日 11:22:14   作者:我有一個(gè)夢(mèng)想  
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)圖像腐蝕,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

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

圖像腐蝕可以用“Θ”表示,其數(shù)學(xué)表示形式如式(6.4)所示,通過(guò)公式可以發(fā)現(xiàn),其實(shí)對(duì)圖像A的腐蝕運(yùn)算就是尋找圖像中能夠?qū)⒔Y(jié)構(gòu)元素B全部包含的像素點(diǎn)。

生成常用的矩形結(jié)構(gòu)元素、十字結(jié)構(gòu)元素和橢圓結(jié)構(gòu):

Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
  • shape:結(jié)構(gòu)元素的種類,可以選擇的參數(shù)及含義在表6-5中給出。
  • ksize:結(jié)構(gòu)元素的尺寸大小
  • anchor:中心點(diǎn)的位置,默認(rèn)參數(shù)為結(jié)構(gòu)元素的幾何中心點(diǎn)。

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

腐蝕函數(shù)

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:輸入的待腐蝕圖像,圖像的通道數(shù)可以是任意的,但是圖像的數(shù)據(jù)類型必須是CV_8U,CV_16U,CV_16S,CV_32F或CV_64F之一。
  • dst:腐蝕后的輸出圖像,與輸入圖像src具有相同的尺寸和數(shù)據(jù)類型。
  • kernel:用于腐蝕操作的結(jié)構(gòu)元素,可以自己定義,也可以用getStructuringElement()函數(shù)生成。
  • anchor:中心點(diǎn)在結(jié)構(gòu)元素中的位置,默認(rèn)參數(shù)為結(jié)構(gòu)元素的幾何中心點(diǎn)
  • iterations:腐蝕的次數(shù),默認(rèn)值為1。
  • borderType:像素外推法選擇標(biāo)志,取值范圍在表3-5中給出。默認(rèn)參數(shù)為BORDER_DEFAULT,表示不包含邊界值倒序填充。
  • borderValue:使用邊界不變外推法時(shí)的邊界值。

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

需要注意的是該函數(shù)的腐蝕過(guò)程只針對(duì)圖像中的非0像素,因此如果圖像是以0像素為背景,那么腐蝕操作后會(huì)看到圖像中的內(nèi)容變得更瘦更??;如果圖像是以255像素為背景,那么腐蝕操作后會(huì)看到圖像中的內(nèi)容變得更粗更大。

簡(jiǎn)單示例

//
// 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();
 
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++獲取任務(wù)欄打開程序窗口示例

    C++獲取任務(wù)欄打開程序窗口示例

    這篇文章主要介紹了C++獲取任務(wù)欄打開程序窗口,大家可以參考使用
    2013-11-11
  • C++多線程編程時(shí)的數(shù)據(jù)保護(hù)

    C++多線程編程時(shí)的數(shù)據(jù)保護(hù)

    這篇文章主要介紹了C++多線程編程時(shí)的數(shù)據(jù)保護(hù),作者針對(duì)C++11版本中的新特性做出了一些解說(shuō),需要的朋友可以參考下
    2015-07-07
  • C++設(shè)計(jì)模式之享元模式

    C++設(shè)計(jì)模式之享元模式

    這篇文章主要介紹了C++設(shè)計(jì)模式之享元模式,本文講解了什么是享元模式、享元模式代碼實(shí)例、享元模式的優(yōu)點(diǎn)等內(nèi)容,需要的朋友可以參考下
    2014-10-10
  • 快速了解Boost.Asio 的多線程模型

    快速了解Boost.Asio 的多線程模型

    這篇文章主要介紹了Boost.Asio 的多線程模型的相關(guān)知識(shí),文中代碼非常詳細(xì),供大家參考和學(xué)習(xí),感興趣的朋友可以了解下
    2020-06-06
  • Qt使用QJson模塊實(shí)現(xiàn)解析Json文件

    Qt使用QJson模塊實(shí)現(xiàn)解析Json文件

    在項(xiàng)目開發(fā)過(guò)程中,經(jīng)常會(huì)遇到讀寫Json文件的需求,掌握J(rèn)son文件的操作是基礎(chǔ)中的基礎(chǔ),下面我們就來(lái)看看如何使用QT內(nèi)置的QJson模塊解析Json文件吧
    2023-10-10
  • C++圖文并茂分析講解模板

    C++圖文并茂分析講解模板

    C++語(yǔ)言的模板技術(shù)包括函數(shù)模板和類模板,模板技術(shù)是一種代碼重用技術(shù),函數(shù)和類是C++語(yǔ)言中兩種主要的重用代碼形式,這篇文章主要介紹了C++函數(shù)模板和類模板,需要的朋友可以參考下
    2022-09-09
  • C語(yǔ)言指針入門學(xué)習(xí)面面觀

    C語(yǔ)言指針入門學(xué)習(xí)面面觀

    這篇文章主要介紹了C語(yǔ)言指針的一些基礎(chǔ)知識(shí),指針可以說(shuō)是C語(yǔ)言入門學(xué)習(xí)中的頭等大事,文中從數(shù)組和函數(shù)等多方面剖析C中指針的作用,需要的朋友可以參考下
    2016-02-02
  • 基于C語(yǔ)言字符串函數(shù)的一些使用心得

    基于C語(yǔ)言字符串函數(shù)的一些使用心得

    以下是對(duì)C語(yǔ)言中字符串函數(shù)的一些使用心得進(jìn)行了詳細(xì)的介紹,需要的朋友可以過(guò)來(lái)參考下
    2013-08-08
  • C語(yǔ)言 淺談棧與隊(duì)列的定義與操作

    C語(yǔ)言 淺談棧與隊(duì)列的定義與操作

    棧和隊(duì)列,嚴(yán)格意義上來(lái)說(shuō),也屬于線性表,因?yàn)樗鼈円捕加糜诖鎯?chǔ)邏輯關(guān)系為 "一對(duì)一" 的數(shù)據(jù),但由于它們比較特殊,因此將其單獨(dú)作為一章,做重點(diǎn)講解
    2021-11-11
  • C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲

    C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單的井字棋游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-04-04

最新評(píng)論