我正在尝试创建一个图像处理软件。
我尝试创建一个非常锐利的蒙版效果时会得到一些奇怪的结果。
我会在这里附上我的代码,我将解释它的作用以及问题所在(或至少,我认为它们在哪里):
void unsharpMask(SDL_Surface* inputSurface,SDL_Surface* outputSurface)
{
Uint32* pixels = (Uint32*)inputSurface->pixels;
Uint32* outputPixels=(Uint32*)outputSurface->pixels;
Uint32* blurredPixels=(Uint32*)blurredSurface->pixels;
meanBlur(infoSurface,blurredSurface);
for (int i=0;i<inputSurface->h;i++)
{
for(int j=0;j<inputSurface->w;j++)
{
Uint8 rOriginal,gOriginal,bOriginal;
Uint8 rBlurred,gBlurred,bBlurred;
Uint32 rMask,gMask,bMask;
Uint32 rFinal,gFinal,bFinal;
SDL_GetRGB(blurredPixels[i*blurredSurface->w+j],blurredSurface->format,&rBlurred,&gBlurred,&bBlurred);
SDL_GetRGB(pixels[i*inputSurface->w+j],inputSurface->format,&rOriginal,&gOriginal,&bOriginal);
rMask=rOriginal - rBlurred;
rFinal=rOriginal + rMask;
if(rFinal>255) rFinal=255;
if(rFinal<=0) rFinal=0;
gMask=gOriginal - gBlurred;
gFinal=gOriginal + gMask;
if(gFinal>255) gFinal=255;
if(gFinal<0) gFinal=0;
bMask=bOriginal - bBlurred;
bFinal=bOriginal + bMask;
if(bFinal>255) bFinal=255;
if(bFinal<0) bFinal=0;
Uint32 pixel =SDL_MapRGB(outputSurface->format,rFinal,gFinal,bFinal);
outputPixels[i *outputSurface->w+j]=pixel;
}
}
}
因此,正如您所看到的,我的函数有两个参数:图像源(将从中提取像素数据,以及将投影图像的目标)。我模糊原始图像,然后我从源图像中减去模糊图像的RGB值以获得“蒙版”,然后,我将蒙版添加到原始图像,就是这样。我添加了一些钳位以确保一切都保持在正确的范围内然后我绘制输出表面上的每个像素。所有这些曲面都已在SDL_PIXELFORMAT_ARGB8888中转换。输出表面被加载到纹理(也是SDL_PIXELFORMAT_ARGB8888)并在屏幕上呈现。
在90%的图像中效果非常好,我得到了我想要的效果,但是,有些像素在某些地方看起来很奇怪。
原件:
结果:
我试图以我知道的任何可能的方式解决这个问题。我认为是一个格式问题,并使用像素位深度,但我无法取得良好的结果。我发现的是所有的价值&gt; 255是负值,我试图让它们完全变白。例如,它适用于天空,但如果你能看到我的例子,草地上的暗值也会受到影响,这使得这不是一个好的解决方案。
当我想添加对比度或使用内核卷积进行锐化时,我也会得到这种错误的像素,并且值非常明亮/暗。 在我看来,像素格式可能存在问题,但我不确定这是否属实。
是否有人在此之前遇到过此类问题或知道可能的解决方案?