- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在编写代码来转换 RGB 格式的图像
RGB RGB RGBRGB RGB RGBRGB RGB RGBRGB RGB RGB
试图转换为灰度 img,但它不起作用。我得到一张没有着色的照片,但不像预期的那样。更像是黑白而不是灰色。
struct Img {
unsigned long sizeX;
unsigned long sizeY;
char *data;
};
void convernt(Img *image)
{
int x,y,i, iRow;
char* p = image->data;
int width=image->sizeX;
int height=image->sizeY;
int rowSize = width*3; // number of bytes in one row
int iPix;
for ( y = 0; y < height; ++y)
{
iRow = y*rowSize ; // index of first pixel in row y
for ( x = 0; x < rowSize; x+=3)
{
iPix = iRow + x*3; // index of pixel
double con=0.2989*p[iPix]+ 0.5870*p[iPix+1]+0.1140*p[iPix+2];
p[iPix] = con;
p[iPix+1] = con;
p[iPix+2] = con;
}
}
}
我希望代码与这个相同但更短应该做完全一样的我想我错过了什么
#define NUM_OF_COLORS 256
// perform histogram equalization algorithm on an image
void convert(Img *image)
{
int i,j;
double* orgHist = (double*)malloc(NUM_OF_COLORS*sizeof(double));
unsigned char* conversionVector = (unsigned char*)malloc(NUM_OF_COLORS);
//clear the vector
for (i=0; i<NUM_OF_COLORS; i++) {
orgHist[i] = 0;
}
//get the histogram of the image
for (j=0; j<image->sizeY; j++) {
for (i=0; i<image->sizeX; i++) {
orgHist[(unsigned char)image->data[3*i + 3*j*image->sizeX + 1]]++;
}
}
//calculate the accumulated histogram of the image
for (i=1; i<NUM_OF_COLORS; i++) {
orgHist[i] = orgHist[i] + orgHist[i-1];
}
//normalize the histogram
for (i=0; i<NUM_OF_COLORS; i++) {
orgHist[i] = orgHist[i]/(image->sizeX*image->sizeY);
conversionVector[i] = 0;
}
// preform the histogram equalization algorithm
i = 0;
j = 0;
while (i<NUM_OF_COLORS) {
if ((((double)j+1)/256) < orgHist[i]) {
j++;
} else {
conversionVector[i] = j;
i++;
}
}
// apply the conversion vector on the image
for (i=0; i<image->sizeX; i++) {
for (j=0; j<image->sizeY; j++) {
image->data[3*i + 3*j*image->sizeX + 1] =
conversionVector[(unsigned char)image->data[3*i + 3*j*image->sizeX + 1]];
}
}
// copy G values to R&B
for (i = 0; i < image->sizeX*image->sizeY; i++) {
image->data[3*i] = image->data[3*i+1];
image->data[3*i+2]= image->data[3*i+1];
}
free(orgHist);
free(conversionVector);
}
最佳答案
要么在 for
循环中将 x
递增 3
,要么将 x*3
添加到指数。但是不要两者都。:
for ( x = 0; x < rowSize; x+=3)
// ^^^ either x++ ...
{
iPix = iRow + x*3; // index of pixel
// ^^ ... or iRow + x;
...
}
因为 rowSize
是字节数而不是像素数,所以调整您的代码如下:
for ( x = 0; x < rowSize; x+=3 )
{
iPix = iRow + x; // index of pixel
double con = 0.2989*p[iPix] + 0.5870*p[iPix+1] + 0.1140*p[iPix+2];
p[iPix] = (char)con;
p[iPix+1] = (char)con;
p[iPix+2] = (char)con;
}
这里是大图像的解决方案:
#define NUM_OF_COLORS 256
unsigned char rTable[NUM_OF_COLORS];
unsigned char gTable[NUM_OF_COLORS];
unsigned char bTable[NUM_OF_COLORS];
void initTables()
{
for ( int c = 0; c < NUM_OF_COLORS; c ++ )
{
rTable[c] = (unsigned char)(0.2989*c);
gTable[c] = (unsigned char)(0.5870*c);
bTable[c] = (unsigned char)(0.1140*c);
}
}
void convernt(struct Img *image)
{
unsigned char* p = (unsigned char*)image->data;
int width=image->sizeX;
int height=image->sizeY;
int rowSize = width*3; // number of bytes in one row
for ( int y = 0; y < height; ++y)
{
int iRow = y*rowSize ; // index of first pixel in row y
for ( int x = 0; x < rowSize; x+=3 )
{
int iPix = iRow + x; // index of pixel
unsigned char col = rTable[p[iPix]] + gTable[p[iPix+1]] + bTable[p[iPix+2]];
p[iPix] = col;
p[iPix+1] = col;
p[iPix+2] = col;
}
}
}
关于c - 从reg-green-blue图像到c中的灰度图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34679039/
这个问题已经有答案了: What is the best way to set a register to zero in x86 assembly: xor, mov or and? (1 个回答)
中有3个事件fns重装 ,我可以对两者做同样的事情 reg-event-db和 reg-event-fx . reg-event-db之间的主要区别是什么, reg-event-fx和 reg-eve
我将 Verilog 与 modelSim 一起使用,当我尝试将 reg 变量分配给另一个 reg 变量的不同部分时出现以下错误: ** Error: Range width must be grea
我在Oracle Forms中要求编写一个PLSQL块,该块将通过包含逗号分隔记录的游标从数据库中读取数据。我已经完成了逻辑,但想检查一下我开发的这个逻辑是否可以以任何方式改进。。因此,我使用subs
使用以下代码是否存在执行速度差异: cmp al, 0 je done 以及以下内容: or al, al jz done 我知道JE和JZ指令是相同的,并且使用OR可以使字节大小提高1个字节。但是,
我正在维护和扩展诊断测试套件的功能,这段代码多次出现,但我不确定它的作用: int ret = 0, i, *reg; int size = sizeof(Regs)/sizof(Reg); for(
在一般情况下,可以使用内存或寄存器操作数的指令如何使用内存操作数变慢然后 mov + mov -> 指令 -> mov + mov 基于在 Agner Fog's instruction tables
假设module_a里面有register_a,它需要链接到module_b。 register_a 是否应该单独声明并分配给 module_a 的输出: reg register_a; assign
这是 ls -R 命令的输出: .: compare.sh searchByFile.sh startup.sh temp.txt test.sh compare.sh~ search
众所周知,WaveFront (AMD OpenCL) 与 WARP (CUDA) 非常相似:http://research.cs.wisc.edu/multifacet/papers/isca14-
我想将一张图片与其他图片列表一张一张地进行比较,然后我想知道哪张图片的相似度更高。 我试图用 Python OPENCV facerec_demo.py 做同样的事情,但它给出了错误: Attribu
打开光驱硬盘的自动运行特性 REG 复制代码 代码如下: Windows Registry Editor Version 5.00</p>
代码如下: Windows Registry Editor Version 5.00</p> <p>[HKEY_CURRENT_USER\Software\Microso
代码如下: Windows Registry Editor Version 5.00</p> <p>[HKEY_LOCAL_MACHINE\SYSTEM\ControlS
代码如下: Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\exefile] @="应用程序&q
我知道在 REG 文件的行首放一个分号表示它已被注释。我想知道是否可以在一行(一行的右侧)后添加注释? 最佳答案 在同一行的注释前加上分号就足够了。换句话说,reg 文件在带有注册表项的一行以及整行注
我在 Verilog 中有这个架构/拓扑: 如何访问内部注册 IntReg ,这不是 IntModule 中的输入/输出,在 SystemVerilog 中? always @(posedge clk
我正在尝试使用字节流读取包含普通文本数据的文件。而且我知道在字节流中,每个字节都将被一个一个地读取。因此,如果我通过字节流读取文本文件中的数据 Hi How are you!!!!! 那么它应该给我每
我有一个运行 IIS/Asp.net 的网站的登录表单,在预订期间因为非常缓慢。 在登录页面我正在做的: $("#submit1").trigger('click') //this will logi
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: non-static variable cannot be referenced from a static
我是一名优秀的程序员,十分优秀!