首页 > 其他分享 >35. 图像物体的边界

35. 图像物体的边界

时间:2025-01-02 18:57:25浏览次数:3  
标签:边界 格子 int 35 像素 相邻 arr5 图像

题目描述

给定一个二维数组M行N列,二维数组里的数字代表图片的像素,为了简化问题,仅包含像素1和5两种像素,每种像素代表一个物体,2个物体相邻的格子为边界,求像素1代表的物体的边界个数。
像素1代表的物体的边界指与像素5相邻的像素1的格子,边界相邻的属于同一个边界,相邻需要考虑8个方向(上,下,左,右,左上,左下,右上,右下)。
其他约束:
地图规格约束为:
0<M<100
0<N<100
1)如下图,与像素5的格子相邻的像素1的格子(0,0)、(0,1)、(0,2)、(1,0)、(1,2)、(2,0)、(2,1)、(2,2)、(4,4)、(4,5)、(5,4)为边界,另(0,0)、(0,1)、(0,2)、(1,0)、(1,2)、(2,0)、(2,1)、(2,2)相邻,为1个边界,(4,4)、(4,5)、(5,4)相邻,为1个边界,所以下图边界个数为2。
在这里插入图片描述

6 6

1 1 1 1 1 1

1 5 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 5
2)如下图,与像素5的格子相邻的像素1的格子(0,0)、(0,1)、(0,2)、(1,0)、(1,2)、(2,0)、(2,1)、(2,2)、(3,3)、(3,4)、(3,5)、(4,3)、(4,5)、(5,3)、(5,4)、(5,5)为边界,另这些边界相邻,所以下图边界个数为1。注:(2,2)、(3,3)相邻。

在这里插入图片描述

6 6

1 1 1 1 1 1

1 5 1 1 1 1

1 1 1 1 1 1

1 1 1 1 1 1

1 1 1 1 5 1

1 1 1 1 1 1 

输入描述:

  • 第一行,行数M,列数N 第二行开始,是M行N列的像素的二维数组,仅包含像素1和5

输出描述:

  • 像素1代表的物体的边界个数。如果没有边界输出0(比如只存在像素1,或者只存在像素5)。

思路

在这里插入图片描述

一、问题分析

首先读题,仔细看描述中的内容,发现需求是

1.给定一个二维数组M行N列,

2.二维数组里的数字代表图片的像素,

3.为了简化问题,仅包含像素1和5两种像素

4.每种像素代表一个物体,

5.2个物体相邻的格子为边界,

6.求像素1代表的物体的边界个数。

7.像素1代表的物体的边界指与像素5相邻的像素1的格子,

8.边界相邻的属于同一个边界,

9.相邻需要考虑8个方向(上,下,左,右,左上,左下,右上,,右下)。

10.其他约束:地图规格约束为:M、N均大于0小于100

11.输入描述:第一行,行数M,列数N

第二行开始,是M行N列的像素的二维数组,仅包含像素1和5

12.输出描述:像素1代表的物体的边界个数。如果没有边界输出0(比如只存在像素1,或者只存在像素5)。

二、解题思路

1.首先我们需要定义两个整数M和N用于存储行数和列数

int M, N;

scanf("%d %d", &M, &N);

2.定义一个int arr5[M * N][3];用来储存像素5格子的坐标,以及是否被访问过

3.然后我们读取像素为5的格子的坐标,

4.遍历像素为5的格子的坐标,对于每个格子,我们如果之前没有访问过,我们bnumber(边界数量)加一,然后检查所有这个格子后面的格子在这个格子的x,y坐标+-3范围内是否有其他像素为5的格子,如果有我们标记成已访问(因为属于同一边界)。

5.对于已经访问过的格子我们不做重复的搜索。

三、具体步骤

使用的语言是C

#include <stdio.h>
#include <stdbool.h>

void findHelper(int arr5[][3], int idx5, int current) {
    for(int i = current + 1; i < idx5; i++) {
        if((arr5[i][0] >= arr5[current][0] - 3) && (arr5[i][0] <= arr5[current][0] + 3) && (arr5[i][1] >= arr5[current][1] - 3) && (arr5[i][1] <= arr5[current][1] + 3)) {
            arr5[i][2] = 1;
        }
    }
}

int findBoundary(int arr5[][3], int idx5) {
    int bnumber = 0;
    for (int i = 0; i < idx5; i++) {
        if(arr5[i][2] == 1) continue;
        else if(arr5[i][2] == 0) {
            arr5[i][2] = 1;
            bnumber++;
            // printf("at position x:%d, y:%d\n", arr5[i][0], arr5[i][1]);
            findHelper(arr5, idx5, i);
        }
    }
    return bnumber;
}

int main() {
    int M, N;
    scanf("%d %d", &M, &N);
    printf("The M is %d, N is %d\n", M, N);
    if (M == 0 || N == 0) {
        printf("0\n");
        return 0;
    }
    int arr5[M * N][3];
    int idx5 = 0;
    bool have1 = false;
    int tempnum;
    for (int i = 0; i < M; i++) {
        for (int j = 0; j < N; j++) {
            scanf("%d", &tempnum);
            if (tempnum == 5) {
                arr5[idx5][0] = i;
                arr5[idx5][1] = j;
                arr5[idx5][2] = 0;
                idx5++;
            }
            if (tempnum == 1) {
                have1 = true;
            }
        }
    }
    if (idx5 > 0 && have1) {
        int anwser = findBoundary(arr5, idx5);
        printf("%d\n", anwser);
    } else {
        printf("0\n");
    }
    return 0;
}

标签:边界,格子,int,35,像素,相邻,arr5,图像
From: https://blog.csdn.net/bingw0114/article/details/143782777

相关文章

  • Python OpenCV 图像处理中的应用实例
    1.图像读取与显示这是图像处理的第一步,也是最简单的一步。使用OpenCV读取图像并显示它。importcv2#读取图像image=cv2.imread('example.jpg')#显示图像cv2.imshow('Image',image)cv2.waitKey(0)#等待按键cv2.destroyAllWindows()#关闭所有窗口2.图像......
  • 推荐5个提升AI面试成功率的工具:包含AI对话、AI文案、AI图像等
    在如今竞争激烈的就业市场,许多大学生面临着求职难题。随着人工智能的普及,越来越多求职者开始使用AI工具来提升面试表现,以此增加在就业市场的竞争力。今天,我想与大家分享5款有助于求职的AI工具,特别是以‘多面鹅’为核心的对话模拟工具,它能够帮助你在面试中脱颖而出。1.多面......
  • 推荐5款创新智能的AI工具:包含AI面试、AI图像、AI设计
    随着大学生求职难度加大,尤其是在当前就业市场寒冬的情况下,越来越多的求职者开始寻找有效的途径来提升自己的竞争力。AI工具作为一种新兴的辅助工具,已经在求职面试、简历撰写等多个领域展现出其强大的功能。在这里,我想要向大家推荐五款实用的AI工具,帮助你在求职过程中游刃有......
  • [CF2353D] Refined Product Optimality 题解
    首先让我们输出的是不操作的值。不定序,一看就很贪心。经过分类分类分类可证,\(a,b\)都是升序(降序)的时候是最优的。再看加操作的。相当于要维护这两个升序序列。我们发现,每次操作影响的值很少,最多两个值。在一个连续段中,修改的值相当于和末尾值交换,再加一。唐点:找这个末尾没必要......
  • 重新振作第33-35天----悲伤
    还是很痛苦。数据库大作业占比太小了,不想认真做,就简简单单做了一下。然后组团完成了一下报告。移动应用开发实验4闪退。。。。。真的莫名闪退,累了。只能开始P图了。代码没报错,也能构建成功,就是打开的时候不知名闪退。汇编实验*3简单地完成了三个实验的实验报告,还没有开始进......
  • Adobe Photoshop(简称PS2025)图像处理软件win/mac下载安装
    AdobePhotoshop软件简介AdobePhotoshop(简称PS)是由AdobeSystems开发的一款图像处理软件,广泛应用于图像编辑、照片修饰、数字绘画等领域。它以强大的功能和灵活的操作界面著称,是专业设计师、摄影师和艺术家等创意工作者的必备工具。PS下载链接https://pan.baidu.com/s/189......
  • halcon中图像滤波分为空间域和频域两种方法
    均值滤波是一种线性平滑滤波。基本思想是用某像素邻域几个像素的平均值代替此像素原来的灰度值。高斯滤波是用某像素邻域几个像素的加权平均值代替此像素的原有灰度值。总结:图像滤波分为空间域和频域两种方法。空间域滤波主要是对像素的直接处理,它将一个像素点周围的像素......
  • OpenCV 图像处理之形态学转换
    摘要: 形态学转换是图像处理中的重要技术,它基于图像的形状特征进行操作,能够有效地对图像进行增强、去噪、分割等处理。本文详细介绍了OpenCV中形态学转换的多种方法,包括侵蚀、扩张、开运算、闭运算、形态学梯度、顶帽和黑帽,并通过Python代码实现这些方法,深入探讨了它们的原......
  • HOG特征提取-matlab图像处理第一期(附完整代码)
    文章目录概要整体架构流程技术名词解释技术细节代码解析注意事项小结完整代码概要HOG(HistogramofOrientedGradients,方向梯度直方图)是一种在计算机视觉和图像处理中用于目标检测的特征描述子。本文将详细介绍如何使用MATLAB实现一个简单的HOG特征提取函数HOG_fea......
  • LBP特征提取-matlab图像处理第2期(附完整代码)
    文章目录概要整体架构流程技术名词解释技术细节完整代码/原理及注释注意事项小结概要LBP(LocalBinaryPatterns,局部二值模式)是一种用于纹理分析和描述的简单而有效的特征。它具有旋转不变性和一定的尺度不变性,并且对灰度变化不敏感。本文将介绍如何使用MATLAB实现......