- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试创建一个代码来找到另一个图像中的边界,如下图所示。
图片
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
------------------------------------------------
0: . . . . . . . . . . . . . . . .
1: . . . . . . . . . . . . . . . .
2: . . . . . . . . . . . . . . . .
3: . . . . x . . . . . . . . . . .
4: . . . x . x . . . . x . . . . .
5: . . x x . . . . . x x x . . . .
6: . . . x x x x x . x x x x . . .
7: . . . x x x x x . x x x x . . .
8: . . . . . x x x x x x x x . . .
9: . . . . . x x x x x x x x . . .
10: . . . . . x x x . x x x . . . .
11: . . . . x . x x x x x . . . . .
12: . . . x . . . . x x . . . . . .
13: . . . . . . . . . . . . . . . .
14: . . . . . . . . . . . . . . . .
15: . . . . . . . . . . . . . . . .
我必须标记作为此图像边界的每个 x。我正在尝试基于邻居来做到这一点,但我不知道我应该采取什么样的逻辑。欢迎任何帮助。谢谢。
最佳答案
首先,您需要编写一个处理图像的函数。据推测,图像由二维字符数组表示,因此该函数将需要遍历该数组。第二个函数可用于确定图像的每个 'x'
是否在边缘上。结果可以存储在输出数组中。
现在,要编写可能称为 is_edge()
的第二个函数,您需要确定 'x'
位于边缘上意味着什么的图像。如果前景像素与背景像素相邻('.'
),则第一次尝试可能会在图像边缘有一个前景像素。这听起来不错,但生成的图像可能有点“沉重”:
Image edges (is_edge1):
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-------------------------------------------------
0: . . . . . . . . . . . . . . . .
1: . . . . . . . . . . . . . . . .
2: . . . . . . . . . . . . . . . .
3: . . . . x . . . . . . . . . . .
4: . . . x . x . . . . x . . . . .
5: . . x x . . . . . x x x . . . .
6: . . . x x x x x . x . x x . . .
7: . . . x x x . x . x . . x . . .
8: . . . . . x . x x x . . x . . .
9: . . . . . x . x x x . x x . . .
10: . . . . . x x x . x x x . . . .
11: . . . . x . x x x x x . . . . .
12: . . . x . . . . x x . . . . . .
13: . . . . . . . . . . . . . . . .
14: . . . . . . . . . . . . . . . .
15: . . . . . . . . . . . . . . . .
这里有一些像素,例如 [5][10],可能已被删除。如果这看起来不太正确,那么您可以重新考虑 is_edge()
函数。相反,如果前景像素与不在其角之一的背景像素相邻,则前景像素位于边缘上怎么办?这应该删除刚刚看到的类型的额外像素:
Image edges (is_edge2):
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-------------------------------------------------
0: . . . . . . . . . . . . . . . .
1: . . . . . . . . . . . . . . . .
2: . . . . . . . . . . . . . . . .
3: . . . . x . . . . . . . . . . .
4: . . . x . x . . . . x . . . . .
5: . . x x . . . . . x . x . . . .
6: . . . x x x x x . x . . x . . .
7: . . . x x . . x . x . . x . . .
8: . . . . . x . . x . . . x . . .
9: . . . . . x . . x . . . x . . .
10: . . . . . x . x . x . x . . . .
11: . . . . x . x x x . x . . . . .
12: . . . x . . . . x x . . . . . .
13: . . . . . . . . . . . . . . . .
14: . . . . . . . . . . . . . . . .
15: . . . . . . . . . . . . . . . .
此方法在某些方面似乎更好,但它似乎也删除了太多 内部像素。请注意,[11][9] 处的像素现在已被移除;从原始图像来看,这似乎不应该被删除。一种修改是,如果前景像素与不在其角之一处的背景像素相邻,或者如果它与相对对角处的两个背景像素相邻,则前景像素在边缘上。这将保留“桥接”像素,例如 [11][9] 中的像素:
Image edges (is_edge3):
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
-------------------------------------------------
0: . . . . . . . . . . . . . . . .
1: . . . . . . . . . . . . . . . .
2: . . . . . . . . . . . . . . . .
3: . . . . x . . . . . . . . . . .
4: . . . x . x . . . . x . . . . .
5: . . x x . . . . . x . x . . . .
6: . . . x x x x x . x . . x . . .
7: . . . x x . . x . x . . x . . .
8: . . . . . x . . x . . . x . . .
9: . . . . . x . . x . . . x . . .
10: . . . . . x . x . x . x . . . .
11: . . . . x . x x x x x . . . . .
12: . . . x . . . . x x . . . . . .
13: . . . . . . . . . . . . . . . .
14: . . . . . . . . . . . . . . . .
15: . . . . . . . . . . . . . . . .
这可能是上述替代方案中最好的。但是考虑这个测试用例:
. . . . .
. . x . .
. x x x .
. . x . .
. . . . .
在上面建议的三种方法中,只有第二种会从图像中心移除 x
。也许一种方法在某些情况下效果更好,而另一种方法在其他情况下效果更好。或者可能需要更好的方法。
这是用于生成上述输出的完整程序。 find_edges()
函数以函数指针作为参数,因此可以轻松实现、尝试和比较不同的 is_edge()
函数。我相信您可以找到改进此代码的方法。
#include <stdio.h>
#define IMAGE_SZ 16
void show_image(char img[][IMAGE_SZ], size_t img_sz);
void find_edges(char in[][IMAGE_SZ],
char out[][IMAGE_SZ],
size_t img_sz,
int (*is_edge)(size_t, size_t, char [][IMAGE_SZ], size_t));
int is_edge1(size_t y, size_t x, char in[][IMAGE_SZ], size_t img_sz);
int is_edge2(size_t y, size_t x, char in[][IMAGE_SZ], size_t img_sz);
int is_edge3(size_t y, size_t x, char in[][IMAGE_SZ], size_t img_sz);
int main(void)
{
char image_in[IMAGE_SZ][IMAGE_SZ] = { "................",
"................",
"................",
"....x...........",
"...x.x....x.....",
"..xx.....xxx....",
"...xxxxx.xxxx...",
"...xxxxx.xxxx...",
".....xxxxxxxx...",
".....xxxxxxxx...",
".....xxx.xxx....",
"....x.xxxxx.....",
"...x....xx......",
"................",
"................",
"................" };
char edge_out[IMAGE_SZ][IMAGE_SZ];
puts("Input image:");
show_image(image_in, IMAGE_SZ);
puts("Image edges (is_edge1):");
find_edges(image_in, edge_out, IMAGE_SZ, is_edge1);
show_image(edge_out, IMAGE_SZ);
puts("Image edges (is_edge2):");
find_edges(image_in, edge_out, IMAGE_SZ, is_edge2);
show_image(edge_out, IMAGE_SZ);
puts("Image edges (is_edge3):");
find_edges(image_in, edge_out, IMAGE_SZ, is_edge3);
show_image(edge_out, IMAGE_SZ);
return 0;
}
void show_image(char img[][IMAGE_SZ], size_t img_sz)
{
/* print top numbers */
printf("%4c", ' ');
for (size_t j = 0; j < img_sz; j++) {
printf("%-3zu", j);
}
putchar('\n');
/* print dashes */
printf("%4c", '-');
for (size_t j = 0; j < img_sz; j++) {
printf("%3s", "---");
}
putchar('\n');
/* print rows */
for (size_t i = 0; i < img_sz; i++) {
printf("%2zu: ", i);
for (size_t j = 0; j < img_sz; j++) {
printf("%-3c", img[i][j]);
}
putchar('\n');
}
putchar('\n');
}
void find_edges(char in[][IMAGE_SZ],
char out[][IMAGE_SZ],
size_t img_sz,
int (*is_edge)(size_t, size_t, char [][IMAGE_SZ], size_t))
{
for (size_t i = 0; i < img_sz; i++) {
for (size_t j = 0; j < img_sz; j++) {
out[i][j] = is_edge(i, j, in, img_sz) ? 'x' : '.';
}
}
}
/* A pixel is an edge if it is adjacent to a background pixel */
int is_edge1(size_t y, size_t x, char in[][IMAGE_SZ], size_t img_sz)
{
int edge_found = 0;
if (in[y][x] == 'x') {
size_t y_start = (y == 0 ? 0 : y-1);
size_t y_stop = (y == (img_sz-1) ? img_sz-1: y+1);
size_t x_start = (x == 0 ? 0 : x-1);
size_t x_stop = (x == (img_sz-1) ? img_sz-1 : x+1);
for (size_t i = y_start; i <= y_stop; i++) {
for (size_t j = x_start; j <= x_stop; j++) {
if (in[i][j] == '.') {
edge_found = 1;
break;
}
}
if (edge_found) {
break;
}
}
}
return edge_found;
}
/* a pixel is an edge if it is adjacent to a background pixel that is
* not a corner pixel
*/
int is_edge2(size_t y, size_t x, char in[][IMAGE_SZ], size_t img_sz)
{
int edge_found = 0;
if (in[y][x] == 'x') {
size_t y_start = (y == 0 ? 0 : y-1);
size_t y_stop = (y == (img_sz-1) ? img_sz-1: y+1);
size_t x_start = (x == 0 ? 0 : x-1);
size_t x_stop = (x == (img_sz-1) ? img_sz-1 : x+1);
edge_found = (in[y_start][x] == '.' ||
in[y][x_start] == '.' ||
in[y][x_stop] == '.' ||
in[y_stop][x] == '.');
}
return edge_found;
}
/* a pixel is an edge if it is adjacent to a background pixel that is
* not a corner pixel or if it is adjacent to two opposite diagonal
* corner pixels.
*/
int is_edge3(size_t y, size_t x, char in[][IMAGE_SZ], size_t img_sz)
{
int edge_found = 0;
if (in[y][x] == 'x') {
size_t y_start = (y == 0 ? 0 : y-1);
size_t y_stop = (y == (img_sz-1) ? img_sz-1: y+1);
size_t x_start = (x == 0 ? 0 : x-1);
size_t x_stop = (x == (img_sz-1) ? img_sz-1 : x+1);
edge_found = (in[y_start][x] == '.' ||
in[y][x_start] == '.' ||
in[y][x_stop] == '.' ||
in[y_stop][x] == '.');
if (edge_found == 0) {
edge_found = ((in[y_start][x_start] == '.' &&
in[y_stop][x_stop] == '.') ||
(in[y_start][x_stop] == '.' &&
in[y_stop][x_start] == '.'));
}
}
return edge_found;
}
关于c - 边界图像分割,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45222173/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!