c++ - 二维字符数组的膨胀/腐蚀
问题描述
我试图弄清楚为什么我的扩张图像功能没有产生正确的输出。
我的目标是变成这样:
.........
.........
....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
到目前为止我实现的函数使用双循环循环遍历二维数组,当它找到应该被扩张的字符时,它会检查边界是否在附近并相应地设置坐标。
解决方案
除了问题评论中讨论的输入解析问题外,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);
}
推荐阅读
- python - pyinstaller 后 Matplotlib 动画不起作用
- arrays - 反应原生多选项目
- r - 检查或替换函数 ggplot2::discrete_scale() 中参数“调色板”的值?
- logging - 星号有时会感到困惑
- c++ - 我可以在 SDL 窗口外跟踪我的鼠标位置吗?
- github - 作为作者如何请求 PR 的更改?
- c++ - 对可变参数模板使用 const 参数
- java - RMI:ServerException、RemoteException、UnmarshalException、UnmarshalException
- ruby-on-rails - 在 Rails 控制台中调用控制器方法时,如何将参数传递给它?
- wordpress - 将自定义链接添加到订单表 WordPress