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

news/2024/7/21 3:53:05 标签: 图像处理, 计算机视觉, opencv

形态学开运算

  • 题目信息
    • 输入
    • 输出
    • 测试样例
  • 解答

题目信息

图像的形态学是图像处理中可以化为一个单独的分支,主要是由数学的集合论中的相关理论发展而来,用于处理灰度图像与二值化图像中的重要手段。
开运算(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;
}


http://www.niftyadmin.cn/n/1342196.html

相关文章

SUSE_Telnet、SSH服务搭建

开启Telnet服务Telnet协议是TCP/IP协议族中的一员&#xff0c;是Internet远程登录服务的标准协议和主要方式&#xff0c;常用的远程控制Web服务器的方法。Telnet为用户提供在本地计算机完成远程主机工作的能力。Telnet将用户的所有内容&#xff0c;包括用户名和密码都明文在互联…

Doclever 接口mock 操作

查看 接口项目mock 查看说明 假设 本机项目路径为 http://localhost:8080 >> 启动 node node net.js http://org.my.com/mock/5c80b952cd2951002667d113 http://localhost:8080 >> 接口说明&#xff1a; 开发中的才可以进行Mock >> 进行mock接口调用 常见…

Corosync/Openais+Pacemaker+ISCSI+OCFS:构建高可用Web群集

目的&#xff1a;实现高可用的Web群集&#xff0c;后方共享存储&#xff1a;ISCSI&#xff08;IP-SAN&#xff09;&#xff1b;为了实现资源同步&#xff0c;采用OCFS群集文件系统.特点&#xff1a;高可用节点之间&#xff0c;不必需要心跳线链接需要去掉通信的口令&#xff08…

bzoj 1578 Stock Market 股票市场

Description 尽管奶牛们天生谨慎&#xff0c;她们仍然在住房抵押信贷市场中受到打击&#xff0c;现在她们开始着手于股市。 Bessie很有先见之明&#xff0c;她不仅知道今天S (2 < S < 50)只股票的价格&#xff0c;还知道接下来一共D(2 < D < 10)天的&#xff08;包…

怎样把python的列表部分排序_如何对Python列表进行部分排序?

部分排序&#xff08;参见the Wikipedia page&#xff09;比实际排序更有效。这些算法类似于排序算法。我将概述基于堆的部分排序&#xff08;尽管在该页上它不是最有效的&#xff09;。在 你想要最老的。您将一个接一个地将元素粘贴到堆中&#xff0c;当堆中的最新的元素太大时…

操作系统实验五·xv6系统内存布局修改·栈空间位置变更与栈不足时扩充

xv6系统内存布局修改栈空间位置变更与栈不足时扩充1.实验目的2.实验内容3. 实验手册4. 实验环境5. 程序设计和实现5.1系统函数修改5.2 编译运行6. 实验结果和分析1.实验目的 更改xv6系统的用户内存布局。 2.实验内容 重新安排地址空间&#xff0c;使得其更像linux。 xv6地址…

Cookie和localStorage、sessionStorage的区别

Cookie 1、因为HTTP请求 无状态&#xff0c;所以需要cookie去维持客户端状态 2、过期时间 expire 3、cookie的生成方式 ①、http response header 中的set-cookie ②、js中可以通过documentdocument.cookie可以读写cookie 4、仅仅作为浏览器存储&#xff08;大小4kb左右&#…

[cpp]找出二维圆形中相交次数最少的圆形

朋友做助教&#xff0c;拿来的一道题&#xff0c;很简单&#xff0c;权当结对编程的一次练习。 问题&#xff1a; 定义一个类表示二维空间中的圆形。  要求&#xff1a;    1. 包括如下数据成员&#xff1a;圆心坐标x, y; 半径r。坐标、半径可以为任意实数。为保护数据安…