algorytm.org

Implementacja w JavaScript

Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Algorytm Stucki'ego - Implementacja w JavaScript
Ocena użytkownikóww: *****  / 0
SłabyŚwietny
Nadesłany przez Tomasz Lubiński, 24 listopada 2011 23:58
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.
Pobierz pełne rozwiązanie.

Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.

stucki.js:
//Algorytm Stucki'ego
//(c) 2011 by Tomasz Lubinski
//www.algorytm.org

/* Data of the image */
var imageData;

/* shift used by errors array (to avoid indexes less than 0) */
var shift = 2;

/* Stucki algorithm */
function stucki()
{
	var canvas = document.getElementById("canvas");
	var ctx = canvas.getContext("2d");

	// read the width and height of the canvas
	var width = canvas.width;
	var height = canvas.height;
	
	// initialize array with errors
	errors = new Array(height+2);
	for (var i=0; i<height+2; i++) 
	{
		errors[i] = new Array(width+4);
		for (var j=0; j<width+4; j++)
		{
			errors[i][j] = 0;
		}		
	}
	
	// perform Stucki algorithm
	for (var i=0; i<height; i++)
	{
		for (var j=0; j<width; j++)
		{
			index = (i*width+j)*4;
			val = 0.299*imageData.data[index+0] + 0.587*imageData.data[index+1] + 0.114*imageData.data[index+2];
			val += errors[i][j+shift];
			if (val > 126)
			{
				// set pixel white
				imageData.data[index+0] = 255;
				imageData.data[index+1] = 255;
				imageData.data[index+2] = 255;
				error = val - 255;
			}
			else
			{
				// set pixel black
				imageData.data[index+0] = 0;
				imageData.data[index+1] = 0;
				imageData.data[index+2] = 0;				
				error = val;
			}
			// distribute error introduced by set pixel white/black operation
                	errors[i  ][j+1+shift] += (error*8.0/42.0);
                	errors[i  ][j+2+shift] += (error*4.0/42.0);
                	errors[i+1][j-2+shift] += (error*2.0/42.0);
	                errors[i+1][j-1+shift] += (error*4.0/42.0);
        	        errors[i+1][j  +shift] += (error*8.0/42.0);
        	        errors[i+1][j+1+shift] += (error*4.0/42.0);
        	        errors[i+1][j+2+shift] += (error*2.0/42.0);
                	errors[i+2][j-2+shift] += (error*1.0/42.0);
	                errors[i+2][j-1+shift] += (error*2.0/42.0);
        	        errors[i+2][j  +shift] += (error*4.0/42.0);
        	        errors[i+2][j+1+shift] += (error*2.0/42.0);
        	        errors[i+2][j+2+shift] += (error*1.0/42.0);        	        
		}
	}
	
	// copy the image data back onto the canvas
	ctx.putImageData(imageData, 0, 0);	
}

/* load image pointed by param_file to canvas */
function loadImage(imgSrc) 
{
	var canvas = document.getElementById("canvas");
	var ctx = canvas.getContext("2d");
	
	// add file:// if user specified local path
	if (imgSrc.indexOf("//") == -1 && imgSrc.indexOf(".") != 0) 
	{
		imgSrc = "file:///" + imgSrc;
	}
	
	// load file into canvas
	var img = new Image();
  	img.onload = function(){
		var width = img.width;
		var height = img.height;
 		canvas.width = width;
  		canvas.height = height;
    		ctx.drawImage(img,0,0);
		// replace transparent with white
		try 
		{
    			imageData = ctx.getImageData(0, 0, width, height);
  		} catch(e) 
  		{
  			netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
  			imageData = ctx.getImageData(0, 0, width, height);
  		}
		for (var i=0; i<height; i++)
		{
			for (var j=0; j<width; j++)
			{
				index = (i*width+j)*4;
				if (imageData.data[index+3] == 0)
				{
					imageData.data[index+3] = 255;
					imageData.data[index+0] = 255;
					imageData.data[index+1] = 255;
					imageData.data[index+2] = 255;
				}
			}
		}
  	}
  	img.src = imgSrc;
}
Dodaj komentarz