数字图像处理·形态学开运算

题目信息

图像的形态学是图像处理中可以化为一个单独的分支,主要是由数学的集合论中的相关理论发展而来,用于处理灰度图像与二值化图像中的重要手段。
开运算(Open):图像形态学重要的操作之一,是基于膨胀和腐蚀操作组合而成。主要应用在二值图像中,灰度图像亦可。过程:开运算=先腐蚀+后膨胀 输入图像+结构元素。

输入

输入格式如样例输入所示。
第一行为两个由空格分开的奇数N和M,分别代表进行开运算时使用的矩形结构元的高和宽。
(注:矩形结构元的原点为矩形中心,且结构元内的所有元素均为1)
例如,N=3,M=3表示如下结构元:
1 1 1
1 1 1
1 1 1
第二行为两个由空格分开的数字H和W,分别代表待处理的二值灰度图片的高和宽,并满足H>N, W>M。
接下来H行,每行有W个数字,每个数字代表图片相应位置的灰度值,灰度值的取值为0或者255,相邻的数字由空格隔开。
读取数据时要求以行优先的方式读取。

输出

图片的开运算结果,由H行、W列数字组成。
每一行中的数字用空格隔开,并且行的末尾没有空格符。

测试样例

3 3
7 6
255 255 0 0 0 255
0 255 255 255 255 0
0 255 255 255 255 255
0 255 255 255 255 0
0 255 255 255 0 0
255 255 255 255 255 255
0 0 0 0 0 255
0 0 0 0 0 0
0 255 255 255 255 0
0 255 255 255 255 0
0 255 255 255 255 0
0 255 255 255 0 0
0 255 255 255 0 0
0 0 0 0 0 0

解答

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    //freopen("/Users/zhj/Downloads/text.txt", "r", stdin);

    int N, M, H, W;
    cin >> N >> M >> H >> W;

    int N_side = (N - 1) / 2;
    int M_side = (M - 1) / 2;

    vector<vector<int>> src;
    vector<vector<bool>> flag;
    for (int i = 0; i < H; i++)
    {
        vector<int> line;
        vector<bool> bool_line;
        for (int j = 0; j < W; j++)
        {
            int tmp;
            cin >> tmp;
            line.push_back(tmp);
            bool_line.push_back(false);
        }
        src.push_back(line);
        flag.push_back(bool_line);
    }

    //腐蚀
    for (int i = 0; i < H; i++)
    {
        for (int j = 0; j < W; j++)
        {
            if (src[i][j] == 255)
            {
                bool op = false;
                for (int p = i - N_side; p <= i + N_side; p++)
                {
                    for (int q = j - M_side; q <= j + M_side; q++)
                    {
                        if (p >= 0 && p < H && q >= 0 && q < W)
                        {
                            if (src[p][q] == 0)
                            {//出现0
                                op = true;
                            }
                        }
                    }
                }
                if (op)
                {//出现0
                    flag[i][j] = true;
                }
            }
        }
    }

    for (int i = 0; i < H; i++)
    {
        for (int j = 0; j < W; j++)
        {
            if (flag[i][j])
            {
                src[i][j] = 0;
                flag[i][j] = false;
            }
        }
    }

    //膨胀
    for (int i = 0; i < H; i++)
    {
        for (int j = 0; j < W; j++)
        {
            if (src[i][j] == 0)
            {
                bool op = false;
                for (int p = i - N_side; p <= i + N_side; p++)
                {
                    for (int q = j - M_side; q <= j + M_side; q++)
                    {
                        if (p >= 0 && p < H && q >= 0 && q < W)
                        {
                            if (src[p][q] == 255)
                            {//出现255
                                op = true;
                            }
                        }
                    }
                }
                if (op)
                {//出现255
                    flag[i][j] = true;
                }
            }
        }
    }

    for (int i = 0; i < H; i++)
    {
        for (int j = 0; j < W; j++)
        {
            if (flag[i][j])
            {
                src[i][j] = 255;
            }
        }
    }

    for (int i = 0; i < H; i++)
    {
        for (int j = 0; j < W; j++)
        {
            cout << src[i][j];
            if (j < W - 1)
            {
                cout << " ";
            }
        }
        cout << endl;
    }

    return 0;
}

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhj12399

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值