gpt4 book ai didi

android - 在Android中使用NDK(C/C++)对图像应用灰度效果

转载 作者:行者123 更新时间:2023-11-28 06:57:58 25 4
gpt4 key购买 nike

我想使用 NDK 将灰度效果应用于图像。

为此,我用谷歌搜索了很多,但发现返回的图像有点像负片的结果相同(这是我所相信的)。

我想要什么::

例如::

我有这张原图

enter image description here

应用灰度效果后应该是这样的::

enter image description here

我尝试了什么::

我想使用 NDK 实现此功能,因此我在 .cpp 文件中创建了一个函数

JNIEXPORT void JNICALL Java_com_example_ndksampleproject_MainActivity_jniConvertToGray(JNIEnv * env, jobject  obj, jobject bitmapcolor,jobject bitmapgray)
{
AndroidBitmapInfo infocolor;
void* pixelscolor;
AndroidBitmapInfo infogray;
void* pixelsgray;
int ret;
int y;
int x;

LOGI("convertToGray");
if ((ret = AndroidBitmap_getInfo(env, bitmapcolor, &infocolor)) < 0) {
LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
return;
}

if ((ret = AndroidBitmap_getInfo(env, bitmapgray, &infogray)) < 0) {
LOGE("AndroidBitmap_getInfo() failed ! error=%d", ret);
return;
}

LOGI("color image :: width is %d; height is %d; stride is %d; format is %d;flags is %d",infocolor.width,infocolor.height,infocolor.stride,infocolor.format,infocolor.flags);
if (infocolor.format != ANDROID_BITMAP_FORMAT_RGBA_8888) {
LOGE("Bitmap format is not RGBA_8888 !");
return;
}

LOGI("gray image :: width is %d; height is %d; stride is %d; format is %d;flags is %d",infogray.width,infogray.height,infogray.stride,infogray.format,infogray.flags);
if (infogray.format != ANDROID_BITMAP_FORMAT_A_8) {
LOGE("Bitmap format is not A_8 !");
return;
}

if ((ret = AndroidBitmap_lockPixels(env, bitmapcolor, &pixelscolor)) < 0) {
LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
}

if ((ret = AndroidBitmap_lockPixels(env, bitmapgray, &pixelsgray)) < 0) {
LOGE("AndroidBitmap_lockPixels() failed ! error=%d", ret);
}

LOGI("unlocking pixels height = %d",infocolor.height);

// modify pixels with image processing algorithm

for (y=0;y<infocolor.height;y++) {
argb * line = (argb *) pixelscolor;
uint8_t * grayline = (uint8_t *) pixelsgray;
for (x=0;x<infocolor.width;x++) {
grayline[x] = 0.3 * line[x].red + 0.59 * line[x].green + 0.11*line[x].blue;
}

pixelscolor = (char *)pixelscolor + infocolor.stride;
pixelsgray = (char *) pixelsgray + infogray.stride;
}

LOGI("unlocking pixels");
AndroidBitmap_unlockPixels(env, bitmapcolor);
AndroidBitmap_unlockPixels(env, bitmapgray);
}

上面的函数返回这样的结果::

enter image description here

这个效果看起来像负片。

如果你需要我这边的任何东西,请告诉我..请帮我解决这个问题,因为我已经坚持了好几个小时。

非常感谢...

编辑::

floppy12的建议::

for (y=0;y<infocolor.height;y++) {
argb * line = (argb *) pixelscolor;
uint8_t * grayline = (uint8_t *) pixelsgray;
for (x=0;x<infocolor.width;x++) {
grayline[x] = (255-0.3 * line[x].red) + (255-0.59 * line[x].green) + (255-0.11*line[x].blue)/3;
}

pixelscolor = (char *)pixelscolor + infocolor.stride;
pixelsgray = (char *) pixelsgray + infogray.stride;
}

输出::

enter image description here

编辑 2::

我对图像做了一些简单的修改,它返回了我想要的图像,但图像失去了亮度。

这是我在 native 功能中所做的更改..

for (y=0;y<infocolor.height;y++) {
argb * line = (argb *) pixelscolor;
uint8_t * grayline = (uint8_t *) pixelsgray;
for (x=0;x<infocolor.width;x++) {
grayline[x] = ((255-0.3 * line[x].red) + (255-0.59 * line[x].green) + (255-0.11*line[x].blue))/3;
}

pixelscolor = (char *)pixelscolor + infocolor.stride;
pixelsgray = (char *) pixelsgray + infogray.stride;
}

结果(图像灰度化但失去亮度)::

enter image description here

最佳答案

要获得灰度图像,每个像素应该具有相同数量的红色、绿色和蓝色

也许在你的灰线计算中使用红色分量并将其影响到绿色和蓝色

或使用公式 (R+G+B)/3 = Gray

负片图像通常通过移动每个分量来获得:

NegR = 255 - grayR

等等

所以你可以尝试计算 grayscal[x] = (255 - 0.3*line[x]) + ...

亮度编辑:为了获得更好的亮度,请尝试在灰度计算中添加固定量:

G += Bness;

在这里,只要出于某种奇怪的原因从 255(黑色)变为 0(白色),Bness 似乎应该为负。你想为你的 grascale 值设置一个不低于 0 的下限,然后尝试:

G = max(0, G+Bness);

我推荐像 Bness = -25 这样的东西

编辑实现亮度:

// Declare a global variable for your brightness - outside your class
static uint8_t bness = -25;

// In your grayscale computation function
for y...
for x...
grayscale[x] = ( (255-0.3*line[x].red) + ..... ) /3 ;
int16_t gBright = grayscale[x] + bness;
grayscale[x] = MAX( 0, gBright );

关于android - 在Android中使用NDK(C/C++)对图像应用灰度效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22915293/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com