Показать сообщение отдельно
Старый 20.11.2010, 20:24
djyamato вне форума Посмотреть профиль Отправить личное сообщение для djyamato Посетить домашнюю страницу djyamato Найти все сообщения от djyamato
  № 1  
Ответить с цитированием
djyamato
 
Аватар для djyamato

Регистрация: Feb 2006
Сообщений: 884
Записей в блоге: 2
Отправить сообщение для djyamato с помощью ICQ Отправить сообщение для djyamato с помощью Skype™
По умолчанию Алгоритм фильтра повышения резкости, где у меня неправильно ?

Здравствуйте, нашел алгоритм для повышения резкости тут (Создание графических фильтров для обработки изображений)

написал такой вот код

Код AS3:
import flash.display.BitmapData;
import flash.display.Bitmap;
import flash.geom.Matrix;
 
var ThisSWF=this;
 
var sampleBD:BitmapData=new BitmapData(sample.width,sample.height,true,0xFFFFFF);
sampleBD.draw(sample); // картинка на стэйдже (у меня это мувиклин с именем 'sample')
 
var tmpBitmap:Bitmap;
 
tmpBitmap=new Bitmap(sampleBD);
tmpBitmap.x=sample.x+sample.width+30;
tmpBitmap.y=sample.y;
ThisSWF.addChild(tmpBitmap);
 
var res:BitmapData=new BitmapData(sample.width,sample.height,true,0xFFFFFF);
 
var Pixel:uint;
var LU:uint;
var U:uint;
var RU:uint;
var R:uint;
var RD:uint;
var D:uint;
var LD:uint;
var L:uint;
 
 
// colors
var r:uint;
var g:uint;
var b:uint;
 
 
var X:int;
var Y:int;
 
var sharpArray=new Array(-.1,-.1,-.1,-.1,1.8,-.1,-.1,-.1,-.1);
var smoothArray=new Array(.05,.05,.05,.05,.6,.05,.05,.05,.05);
var delit=1;
 
SHARPEN.addEventListener("mouseUp",sharpenHandler);
 
function sharpenHandler(event:Event):void{
	if(tmpBitmap!=null){
		if(ThisSWF.contains(tmpBitmap)){
			ThisSWF.removeChild(tmpBitmap);
			sampleBD=tmpBitmap.bitmapData.clone();
		}
	}
	res=new BitmapData(sample.width,sample.height,false,0xFF0000);
	setFilter(sharpArray);
	tmpBitmap=new Bitmap(res);
	tmpBitmap.x=sample.x+sample.width+30;
	tmpBitmap.y=sample.y;
	ThisSWF.addChild(tmpBitmap);
}
 
function setFilter(arr):void{
	for (Y=1; Y<sampleBD.height-1; Y+=1) {
		for (X=1; X<sampleBD.width-1; X+=1) {
			var redSumm:uint=0;
			var greenSumm:uint=0;
			var blueSumm:uint=0;
 
			Pixel=sampleBD.getPixel(X,Y); // прочли пиксель
 
			var PixelR:uint=getRed(Pixel);
			var PixelG:uint=getGreen(Pixel);
			var PixelB:uint=getBlue(Pixel);
			PixelR=PixelR*arr[4];
			PixelG=PixelG*arr[4];
			PixelB=PixelB*arr[4];
 
			redSumm+=PixelR;
			greenSumm+=PixelG;
			blueSumm+=PixelB;
 
 
			LU=sampleBD.getPixel(X-1,Y-1);
			var LU_R:uint=getRed(LU);
			var LU_G:uint=getGreen(LU);
			var LU_B:uint=getBlue(LU);
			LU_R=LU_R*arr[0];
			LU_G=LU_G*arr[0];
			LU_B=LU_B*arr[0];
 
 
 
			redSumm+=LU_R;
			greenSumm+=LU_G;
			blueSumm+=LU_B;
 
 
			U=sampleBD.getPixel(X,Y-1);
			var U_R:uint=getRed(U);
			var U_G:uint=getGreen(U);
			var U_B:uint=getBlue(U);
			U_R=U_R*arr[1];
			U_G=U_G*arr[1];
			U_B=U_B*arr[1];
 
			redSumm+=U_R;
			greenSumm+=U_G;
			blueSumm+=U_B;
 
 
			RU=sampleBD.getPixel(X+1,Y-1);
			var RU_R:uint=getRed(RU);
			var RU_G:uint=getGreen(RU);
			var RU_B:uint=getBlue(RU);
			RU_R=RU_R*arr[2];
			RU_G=RU_G*arr[2];
			RU_B=RU_B*arr[2];
 
			redSumm+=RU_R;
			greenSumm+=RU_G;
			blueSumm+=RU_B;
 
 
			R=sampleBD.getPixel(X+1,Y);
			var R_R:uint=getRed(R);
			var R_G:uint=getGreen(R);
			var R_B:uint=getBlue(R);
			R_R=R_R*arr[5];
			R_G=R_G*arr[5];
			R_B=R_B*arr[5];
 
			redSumm+=R_R;
			greenSumm+=R_G;
			blueSumm+=R_B;
 
 
			RD=sampleBD.getPixel(X+1,Y+1);
			var RD_R:uint=getRed(RD);
			var RD_G:uint=getGreen(RD);
			var RD_B:uint=getBlue(RD);
			RD_R=RD_R*arr[8];
			RD_G=RD_G*arr[8];
			RD_B=RD_B*arr[8];
 
			redSumm+=RD_R;
			greenSumm+=RD_G;
			blueSumm+=RD_B;
 
 
			D=sampleBD.getPixel(X,Y+1);
			var D_R:uint=getRed(D);
			var D_G:uint=getGreen(D);
			var D_B:uint=getBlue(D);
			D_R=D_R*arr[7];
			D_G=D_G*arr[7];
			D_B=D_B*arr[7];
 
			redSumm+=D_R;
			greenSumm+=D_G;
			blueSumm+=D_B;
 
 
			LD=sampleBD.getPixel(X-1,Y+1);
			var LD_R:uint=getRed(LD);
			var LD_G:uint=getGreen(LD);
			var LD_B:uint=getBlue(LD);
			LD_R=LD_R*arr[6];
			LD_G=LD_G*arr[6];
			LD_B=LD_B*arr[6];
 
			redSumm+=LD_R;
			greenSumm+=LD_G;
			blueSumm+=LD_B;
 
 
			L=sampleBD.getPixel(X-1,Y);
			var L_R:uint=getRed(L);
			var L_G:uint=getGreen(L);
			var L_B:uint=getBlue(L);
			L_R=L_R*arr[3];
			L_G=L_G*arr[3];
			L_B=L_B*arr[3];
 
			redSumm+=L_R;
			greenSumm+=L_G;
			blueSumm+=L_B;
 
			redSumm=redSumm*delit;
			greenSumm=greenSumm*delit;
			blueSumm=blueSumm*delit;
 
			if(redSumm>255){
				redSumm=255;
			}
			if(greenSumm>255){
				greenSumm=255;
			}
			if(blueSumm>255){
				blueSumm=255;
			}
			if(redSumm<0){
				redSumm=0;
			}
			if(greenSumm<0){
				greenSumm=0;
			}
			if(blueSumm<0){
				blueSumm=0;
			}
			res.setPixel(X,Y,(redSumm*256*256+greenSumm*256+blueSumm));
		}
	}
}
 
function getRed(num:uint):uint{
	return (num >> 16);
}
 
function getGreen(num:uint):uint{
	return ((num >> 8) & 0xFF);
}
 
function getBlue(num:uint):uint{
	return (num & 0xFF);
}
Если подставлять smoothArray, то картинка смягчается правильно (по крайней мере, визуально похоже на размытие), на первом скрине это видно, а если подставить sharpArray, возникают ошибки (на 2м скрине это хорошо видно), подскажите, где я мог ошибиться ?
Изображения