首页 > 解决方案 > 二维字符数组的膨胀/腐蚀

问题描述

我试图弄清楚为什么我的扩张图像功能没有产生正确的输出。

我的目标是变成这样:

.........
.........
....x....
.........
.........

进入这个:

.........
....x....
...xxx...
....x....
.........

对于每个扩张周期。

我没有想到它,但我也需要逆向侵蚀。

到目前为止,这就是我想出的(程序在命令行中使用用户输入argv):

#include <iostream>
#include <fstream>
#include <string>
#include <vector>
#include <sstream>
#include <algorithm>
//look up line by line parsing
using namespace std;
void replacee(vector<vector<char>> &vec, char oldd, char neww)
{
    for (vector<char> &v : vec) // reference to innver vector
    {
        replace(v.begin(), v.end(), oldd, neww); // standard library 
algorithm
    }
}
void dialationn(vector<vector<char>> & vec, char suspect)
{
    for (int i = 0; i < vec.size(); i ++) {
            for (int j = 0; j < vec[i].size(); j++) {
                if (vec[i][j] == suspect) {
                    if (i > 0) {
                     vec[i-1][j] = suspect;
                    }
                    if (j > 0) {
                     vec[i][j-1] = suspect;
                    }
                    if (i + 1<vec.size()) {
                        vec[i+1][j] = suspect;
                    }
                    if (j + 1<vec[i].size()) {
                        vec[i][j+1] = suspect;
                    }
                }
            }
        }
}
int main(int argc, char* argv[]) {

    fstream fin; char ch;
    string name (argv[1]); //File Name.
    vector<vector<char>> data;
    // 2D Vector.
    vector<char> temp;
    // Temporary vector to be pushed 
    // into vec, since its a vector of vectors.
    fin.open(name.c_str(),ios::in);
    // Assume name as an arbitrary file.
    string argument2 (argv[2]);
    string argument3 (argv[3]);
    string argument4 (argv[4]);
    while(fin)
    {
        ch = fin.get();
        if(ch!='\n') {
            temp.push_back(ch);
        }
        else 
        { 
            data.push_back(temp); 
            temp.clear(); 
        }
    }
    if (argument2 == "replace") {
        replacee(data, argument3[0], argument4[0]);
        for (int i = 0; i < data.size(); i ++) {
            for (int j = 0; j < data[i].size(); j++) {
                cout << data[i][j];
            }
            cout << endl;
        }
    } else if (argument2 == "dialate") {
        dialationn(data, argument3[0]);
        for (int i = 0; i < data.size(); i ++) {
            for (int j = 0; j < data[i].size(); j++) {
                cout << data[i][j];
            }
            cout << endl;
        }
    }

    fin.close();
} 

dialationn到目前为止我实现的函数使用双循环循环遍历二维数组,当它找到应该被扩张的字符时,它会检查边界是否在附近并相应地设置坐标。

标签: c++image-processingmathematical-morphologyimage-morphology

解决方案


除了问题评论中讨论的输入解析问题外,OP 提出的膨胀函数不起作用,因为它修改了输入图像,而不是写入新的输出图像。修改输入时,会影响后续像素的膨胀结果。

正确的是:

void dialationn(vector<vector<char>> & vec, char suspect)
{
    vector<vector<char>> out(vec.size(), vector<char>(vec[0].size(), 0))
    for (int i = 0; i < vec.size(); i ++) {
        for (int j = 0; j < vec[i].size(); j++) {
            if (vec[i][j] == suspect) {
                if (i > 0) {
                    out[i-1][j] = suspect;
                }
                if (j > 0) {
                    out[i][j-1] = suspect;
                }
                if (i + 1<vec.size()) {
                    out[i+1][j] = suspect;
                }
                if (j + 1<vec[i].size()) {
                    out[i][j+1] = suspect;
                }
            }
        }
    }
    swap(out, vec);
}

推荐阅读