OpenCV (29): 画像の腐食

1. 画像腐食の原理

        侵食操作は、構造要素 (カーネルまたはテンプレートとも呼ばれます) を画像上でスライドさせ、それを画像内の対応するピクセルと比較することによって機能します。構造要素のすべてのピクセルが画像内の対応する位置のピクセルと一致する場合、その位置のピクセル値は変更されません。構造要素のピクセルが画像内の対応する位置のピクセルと一致しない場合、その位置のピクセル値は 0 (または他の指定されたピクセル値) に設定され、それによって画像の形状と構造が変更されます。

2. 画像腐食の目的: 

  • 画像から小さなオブジェクトを削除する
  • 近くにある 2 つのオブジェクトを分離する

3. 構造化要素生成関数 getStructureElement()

Mat cv::getStructuringElement ( int 形状,

サイズkサイズ、

ポイントアンカー = ポイント(-1,-1)

  • 形状: 構造要素のタイプ。
  • ksize: 構造要素のサイズ。
  • アンカー: 中心点の位置デフォルトのパラメータは構造要素の幾何学的中心点です。

構造要素の型パラメータは次のとおりです。

4. 画像収縮演算関数 erode()

void cv::erode (InputArray src,

出力配列 dst、

入力配列カーネル、

ポイントアンカー = ポイント(-1,-1),

整数反復 = 1、

int cborderType = ボーダー定数、

const スカラー & borderValue = morphologyDefaultBorderValue()

)

  • src: 腐食する入力画像。画像のチャンネル数は任意ですが、画像のデータ型は CV_8U、CV_16U、CV_16S、CV_32F、CV_64F のいずれかでなければなりません。
  • dst: 腐食された出力イメージは、入力イメージ src と同じサイズおよびデータ型を持ちます。
  • kermel: 腐食操作に使用される構造要素。これらは自分で入力することも、getStructuringElement0) 関数を使用して生成することもできます。
  • アンカー: 構造要素の中心点の位置。デフォルトのパラメータは、構造要素の幾何学的中心点です。
  • 反復: 腐食の数。
  • borderType: ピクセル外挿選択フラグ。
  • borderValue: 境界線が変更されない境界値。

5. サンプルコード:

//绘制包含区域函数
void drawState(Mat image, int number, Mat centroids, Mat stats, String string) {
    RNG rng(10086);
    vector<Vec4b> colors;
    for(int i=0;i<number;i++){
        //使用均匀分布的随机数确定颜色
        Vec4b vec4=Vec4b(rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256),rng.uniform(0,256));
        colors.push_back(vec4);
    }
    //以不同颜色标记出不同的连通域
    for(int i=1;i<number;i++){
        //中心位置
        int center_x=centroids.at<double>(i,0);
        int center_y=centroids.at<double>(i,1);
        //矩形边框
        int x=stats.at<int>(i,CC_STAT_LEFT);
        int y=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);
        int area=stats.at<int>(i,CC_STAT_AREA);
        //中心位置绘制
        circle(image,Point(center_x,center_y),2,Scalar(0,255,0),2,8,0);
        //外接矩形
        Rect rect(x,y,w,h);
        rectangle(image,rect,colors[i],1,8,0);
        putText(image, format("%d",i),Point(center_x,center_y),FONT_HERSHEY_SIMPLEX,0.5,Scalar(255,0,255),1);
    }
    imwrite("/sdcard/DCIM/"+string+".png",image);
}

void Image_corrosion(Mat image){
    Mat img2;
    copyTo(image,img2,image);//克隆一个单独的图像,用于后期图像绘制
    Mat rice,riceBW;
    //将图像转成二值图像,用于统计连通域
    cvtColor(image,rice,COLOR_BGR2GRAY);
    threshold(rice,riceBW,50,255,THRESH_BINARY);

    Mat out,stats,centroids;
    //统计图像中连通域的个数
    int number= connectedComponentsWithStats(riceBW,out,stats,centroids,8,CV_16U);
    drawState(image,number,centroids,stats,"Uncorroded_connected");//绘制图像
    Mat strucr1= getStructuringElement(0,Size(3,3));//矩形结构元素
    //Mat strucr1= getStructuringElement(1,Size(3,3));//十字结构元素

    erode(riceBW,riceBW,strucr1);//对图像进行腐蚀
    number= connectedComponentsWithStats(riceBW,out,stats,centroids,8,CV_16U);
    drawState(img2,number,centroids,stats,"corroded_connected");
}

おすすめ

転載: blog.csdn.net/weixin_63357306/article/details/132759158