C++最大黑区域

#include<bits/stdc++.h>
using namespace std;
char a[105][105];
int ans=0,ans1;
int move[4][2]={0,1,1,0,0,-1,-1,0};
void bfs(int x, int y) {
    for (int i=0;i<4;i++) {
        int x1=x+move[i][0];
        int x2=y+move[i][1];
        if (a[x1][x2]=='1') {
            a[x1][x2]='0';
            ans++;
            bfs(x1,x2);
        }
    }
}
int main() {
    int n,m;
    cin>>n>>m;
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            cin>>a[i][j];
        }
    }
    for (int i=1;i<=n;i++) {
        for (int j=1;j<=m;j++) {
            if (a[i][j]=='1') {
                ans=1;
                a[i][j]='0';
                bfs(i,j);
                ans1=max(ans,ans1);
            }
        }
    }
    cout<<ans1<<endl;
    return 0;
}
/*
5 6
0 1 1 0 0 1
1 1 0 1 0 1
0 1 0 0 1 0
0 0 0 1 1 1
1 0 1 1 1 0
*/
/*
7*/

### 回答1: 可以使用OpenCV中的findContours函数找到所有的轮廓,然后通过计算每个轮廓的面积,找到最大的那个轮廓,最后将其余的轮廓都填充为色即可。以下是示例代码: Mat src = imread("input.jpg", ); Mat dst = Mat::zeros(src.size(), CV_8UC1); vector<vector<Point>> contours; vector<Vec4i> hierarchy; findContours(src, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); int maxArea = ; int maxIdx = -1; for (int i = ; i < contours.size(); i++) { int area = contourArea(contours[i]); if (area > maxArea) { maxArea = area; maxIdx = i; } } drawContours(dst, contours, maxIdx, Scalar(255), FILLED); imshow("output", dst); waitKey(); 注意:以上代码仅适用于处理单通道的灰度图像。如果需要处理彩色图像,需要先将其转换为灰度图像。 ### 回答2: 要保留白图像中最大区域的代码,可以使用以下步骤: 1. 导入所需的库。 ```c #include <opencv2/opencv.hpp> #include <iostream> ``` 2. 定义主函数。 ```c int main() { // 读取图像 cv::Mat img = cv::imread("image.jpg", CV_LOAD_IMAGE_GRAYSCALE); // 以灰度图像方式读取 // 判断图像是否成功读取 if (img.empty()) { std::cout << "无法读取图像!" << std::endl; return -1; } // 二值化处理 cv::Mat binaryImg; cv::threshold(img, binaryImg, 128, 255, cv::THRESH_BINARY); // 寻找轮廓 std::vector<std::vector<cv::Point>> contours; cv::findContours(binaryImg, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); // 找到最大的轮廓 int maxContourArea = 0; int maxContourIndex = -1; for (int i = 0; i < contours.size(); i++) { int contourArea = cv::contourArea(contours[i]); if (contourArea > maxContourArea) { maxContourArea = contourArea; maxContourIndex = i; } } // 创建一个空图像,用于保留最大区域 cv::Mat maxContourImg = cv::Mat::zeros(binaryImg.size(), CV_8UC1); // 将最大轮廓绘制在空图像上 cv::drawContours(maxContourImg, contours, maxContourIndex, cv::Scalar(255), cv::FILLED); // 显示最大区域图像 cv::imshow("Max Contour", maxContourImg); cv::waitKey(0); return 0; } ``` 3. 运行代码并调整图像路径。 请注意,这只是一种基本的方法,可能需要根据实际情况进行调整。 ### 回答3: 要实现只保留白图像中最大区域的代码,可以使用OpenCV库中的图像处理函数来完成。以下是一个示例代码实现: ```cpp #include <opencv2/opencv.hpp> #include <iostream> using namespace cv; using namespace std; int main() { Mat image = imread("input_image.jpg", 0); // 读取白图像 threshold(image, image, 0, 255, THRESH_BINARY); // 将图像二值化,将灰度值大于0的像素设为白色(255),小于等于0的像素设为色(0) vector<vector<Point>> contours; // 存储图像中的轮廓 findContours(image, contours, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE); // 查找所有外部轮廓 int maxAreaIndex = 0; double maxArea = 0; for (int i = 0; i < contours.size(); i++) { double area = contourArea(contours[i]); // 计算每个轮廓的面积 if (area > maxArea) { maxArea = area; maxAreaIndex = i; } } Mat result = Mat::zeros(image.size(), CV_8UC1); // 创建一个与原图像大小相同的色图像 drawContours(result, contours, maxAreaIndex, Scalar(255), FILLED); // 将最大轮廓填充为白色 imshow("Original Image", image); imshow("Result", result); waitKey(0); return 0; } ``` 以上示例代码首先加载一个白图像,然后将其二值化,接着使用`findContours`函数查找图像中的所有外部轮廓。通过遍历每个轮廓并计算其面积,找到最大面积的轮廓。最后,创建一个与原图像大小相同的全图像,将最大轮廓填充为白色,并显示结果图像。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值