小编Pet*_*ett的帖子

非常大的图像中的记忆效率线缝合

背景

我使用Synthetic Aperture Radar卫星的非常大的数据集.这些可以被认为是一侧10k像素量级的高动态范围灰度图像.

最近,我一直在开发Lindeberg尺度空间脊检测算法的单尺度变体的应用,用于检测SAR图像中的线性特征.这是对使用方向滤波器或使用Hough变换的改进,这两种方法以前都使用过,因为它的计算成本低于其中任何一种.(我将在4月份的JURSE 2011上展示一些最新成果,如果有帮助,我可以上传预印本).

我目前使用的代码生成一个记录数组,每个像素一个,每个记录描述矩形到像素右下角的一个脊段,并由相邻的像素限定.

struct ridge_t { unsigned char top, left, bottom, right };
int rows, cols;
struct ridge_t *ridges;  /* An array of rows*cols ridge entries */
Run Code Online (Sandbox Code Playgroud)

在一个条目ridges包含脊段如果正好有两个的top,left,rightbottom具有范围值0 - 128.假设我有:

ridge_t entry;
entry.top = 25; entry.left = 255; entry.bottom = 255; entry.right = 76;
Run Code Online (Sandbox Code Playgroud)

然后我可以找到脊段的开始(x1,y1)和结束(x2,y2):

float x1, y1, x2, y2;
x1 = (float) col + (float) entry.top / 128.0;
y1 = (float) …
Run Code Online (Sandbox Code Playgroud)

c scalability image-processing feature-detection satellite-image

12
推荐指数
1
解决办法
735
查看次数

IEEE754浮点值的可移植序列化

我最近一直致力于一个需要存储和加载大量数据的系统,包括单精度浮点值.我决定对整数的网络字节顺序进行标准化,并决定以big-endian格式存储浮点值,即:

  |-- Byte 0 --| |-- Byte 1 -|  Byte 2   Byte 3
  #      ####### #     ####### ######## ########
Sign     Exponent          Mantissa
 1b    8b, MSB first    23b, MSB first
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想提供类似的功能htonl()ntohl(),因为我已经使用这些用于擦拭整数,我也希望有尽可能多的平台独立性尽可能的方式来实现这一点(而假设float类型对应于IEEE754 32位浮点值).有没有办法,可能使用ieee754.h,这样做?

我有一个答案似乎有效,我将在下面发布,但它似乎非常缓慢和低效,我会感谢有关如何使其更快和/或更可靠的任何建议.

c floating-point portability endianness ieee-754

12
推荐指数
1
解决办法
2827
查看次数

库支持非常高动态范围的TIFF文件?

我使用卫星雷达,并提供了一个包含32 bpp灰度数据的(超大)TIFF文件.不幸的是,libtiff是用于处理TIFF文件的标准Linux库,它不支持SampleFormat TIFF文件,这意味着不支持高位深度灰度图像或浮点图像.

有谁知道FOSS C库为这些类型的图像提供支持?如果做不到这一点,任何人都可以提出一个适当的文件格式转换成的,自由和开放源码库,可以加载那个?(理想情况下,科学界应普遍接受数据交换,并得到IDL/ENVI的支持).

c file-format tiff scientific-computing

7
推荐指数
1
解决办法
395
查看次数

自动调整GtkScrolledWindow中的GtkTextView大小

我在gschem上工作,这是一个用于编辑电子原理图的免费软件工具.最近我们使用包含GtkTextViewGtkScrolledWindow遇到了问题.

上下文

最新版本的Ubuntu使用覆盖滚动条,这意味着GtkScrolledWindows不再设置最小高度,为传统滚动条提供足够的空间(实际上,它们的最小高度为0).同样,没有显示文本的GtkTextView请求高度为0.这意味着gschem中的一个可滚动的GtkTextViews被显示为高度中的一个像素,这显然是不可用的.

截图显示已损坏

在上面显示的屏幕截图右侧的对话框中,记下"值:"标签和"添加"按钮之间的不可见小部件.

一些用户已经独立报告了这一点 - 另请参阅错误报告.

显然,我们可以通过以下方式解决这个问题:

g_object_set (textview, "height-request", 100, NULL);
Run Code Online (Sandbox Code Playgroud)

然而,这非常不优雅,并且对于以像素设置非常大的字体大小的用户(例如,具有视力问题的用户或使用高DPI屏幕的用户)将会中断.

因此,理想情况下,我们希望将GtkTextView的最小大小设置为相对于默认字体大小,例如告诉它"显示至少三行文本".

有人能建议一个明智/优雅的方法吗?

c gtk gtk2

7
推荐指数
1
解决办法
606
查看次数

使用 dlsym() 在静态链接库中查找变量

我们有一个链接多个静态库的程序,这些静态库可能定义也可能不定义多个符号,具体取决于编译选项。在 OS X 上,我们使用dlsym(3)NULL 句柄来获取符号地址。但是,在 Linux 上,dlsym(3)始终返回 NULL。

考虑一个简单的程序(来源如下),该程序链接包含一个函数和一个变量的静态库,并尝试打印它们的地址。我们可以检查程序是否包含符号:

$ nm -C test | grep "test\(func\|var\)"
0000000000400715 T testFunc
0000000000601050 B testVar
Run Code Online (Sandbox Code Playgroud)

但是,当程序运行时,两者都找不到:

$ ./test
testVar: (nil)
testFunc: (nil)
Run Code Online (Sandbox Code Playgroud)

我们正在尝试在 Linux 上使用 glibc 实现的dlsym(3)?

 生成文件

(抱歉有空格)

LDFLAGS=-L.
LDLIBS=-Wl,--whole-archive -ltest -Wl,--no-whole-archive -ldl

libtest.o: libtest.c libtest.h
    libtest.a: libtest.o
test: test.o libtest.a
clean:
    -rm -f test test.o libtest.o libtest.a
Run Code Online (Sandbox Code Playgroud)

测试文件

#pragma once
extern void *testVar;
extern int testFunc(int);
Run Code Online (Sandbox Code Playgroud)

测试库

#include "libtest.h"
void *testVar;
int testFunc(int x) { …
Run Code Online (Sandbox Code Playgroud)

c linux gcc static-libraries dlsym

5
推荐指数
1
解决办法
2160
查看次数

获取非原型声明的编译警告

在 C 中,函数声明可以是原型声明或非原型声明。例如,考虑以下最小程序:

int foo (); /* non-prototype declaration */

int bar (void); /* prototype declaration */

int main (int argc, char **argv)
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

尽管在 C99 中非原型声明已经过时,但我无法让 GCC 抱怨它们。例如,使用 GCC 编译上述程序并启用所有错误就会成功:

$ gcc -std=c99 -pedantic -Werror -Wall test.c
$
Run Code Online (Sandbox Code Playgroud)

有没有办法说服 GCC 对不是原型的函数声明发出警告?

(问题的灵感来自Keith Thompson回答。)

c gcc compilation c99 compiler-warnings

3
推荐指数
1
解决办法
1205
查看次数