Jump to content
  • Advertisement

Archived

This topic is now archived and is closed to further replies.

PouyaCatnip

Image bluring: handling the edges

This topic is 5128 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

I've got this image bluring algorithm I'm writing and seem to be somewhat stuck on how to deal with the edges. Its a simple box-filter type blur, first avaraging each pixel across the horizontal scanlines, then again on the vertical. But on the edges the number of samples is obviously much less, as many lie outside the image. First solution was to treat it like a tiling texture and just wrap around:
int wrapValue(int value, int max)
{
	if (value < 0)
		value += max;
	else if (value >= max)
		value -= max;
	
	return value;
}
Unfortunatly: 1. it only works if it has to wrap once. I think I could get around that with some odd modulus behaviour, but can't think of it. 2. It looks *really* bad with my sample image (union jack style crosses) because the corners bleed over:
º ° · ·                   · º º º º º ·                   · · ° 
° ° · ·                   · º º º º º ·                   · · ° 
· · · ·                   · º º º º º ·                   · · · 
· ·   ·                   · º º º º º ·                   ·   · 
· ·     ·                 · º º º º º ·                 ·     · 
          ·               · º º º º º ·               ·         
            ·             · º º º º º ·             ·           
              ·           · º º º º º ·           ·             
                ·         · º º º º º ·         ·               
                  ·       · º º º º º ·       ·                 
                    ·     ° º º º º º °     ·                   
                      ·   ° º º º º º °   ·                     
                        · ° º º ® º º ° ·                       
· · · · · · · · · · ° ° ° ® ® ® © ® ® ® ° ° ° · · · · · · · · · 
º º º º º º º º º º º º º © © © ¢ © © © º º º º º º º º º º º º 
º º º º º º º º º º º º º © © ¢ ¢ ¢ © © º º º º º º º º º º º º 
º º º º º º º º º º º º º © © ¢ ¥ ¢ © © º º º º º º º º º º º º 
º º º º º º º º º º º º º © © ¢ ¢ ¢ © © º º º º º º º º º º º º 
º º º º º º º º º º º º º © © © ¢ © © © º º º º º º º º º º º º 
· · · · · · · · · · ° ° ° ® ® ® © ® ® ® ° ° ° · · · · · · · · · 
                        · ° º º ® º º ° ·                       
                      ·   ° º º º º º °   ·                     
                    ·     ° º º º º º °     ·                   
                  ·       · º º º º º ·       ·                 
                ·         · º º º º º ·         ·               
              ·           · º º º º º ·           ·             
            ·             · º º º º º ·             ·           
          ·               · º º º º º ·               ·         
· ·     ·                 · º º º º º ·                 ·     · 
· ·   ·                   · º º º º º ·                   ·   · 
· · · ·                   · º º º º º ·                   · · · 
° ° · ·                   · º º º º º ·                   · · ° 
Now technically thats the correct behaviour, but it looks like crap The next idea was to clamp the values, but that means the very edge pixel ends up getting sampled multiple times. So I guess I need to only sample it once and reduce my divide:
int testIndex(int value, int max)
{
	if (value < 0)
		value = -1;
	else if (value >= max)
		value = -1;
	
	return value;
}


void blurSlice(int* inSlice, int* outSlice, int sliceLength, int blurSize)
{
	int pixel, sample;
	int pixelSum;

	int index;
	int usedSamples;


	printf("%d Bluring:\n", rank);
	for (pixel=0; pixel<sliceLength; pixel++)
		printf("%d ", inSlice[pixel]);

	printf("\n");fflush(stdout);


	for (pixel=0; pixel<sliceLength; pixel++)
	{
		pixelSum = 0;
		usedSamples = 0;
		for (sample=pixel-blurSize; sample<pixel+blurSize; sample++)
		{
			index = testIndex(sample, sliceLength);
			if (index != -1)
			{
				pixelSum += inSlice[index];
				usedSamples++;
			}
		}
		printf("Samples: %d\n", usedSamples);
		outSlice[pixel] = pixelSum / usedSamples;
	}


	printf("Blur output:\n");
	for (pixel=0; pixel<sliceLength; pixel++)
		printf("%d ", outSlice[pixel]);

	printf("\n");fflush(stdout);
}
However that *still* gives me the bleeding at the corners (in fact it looks pretty identical to the wrapping behaviour). What have I missed? How are edges supposed to be handled in this case? Thanks. [edited by - PouyaCatnip on May 9, 2004 8:42:09 PM]

Share this post


Link to post
Share on other sites
Advertisement

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

Participate in the game development conversation and more when you create an account on GameDev.net!

Sign me up!