Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 数字图像中的瑕疵去除_Apache Flex_Image - Fatal编程技术网

Apache flex 数字图像中的瑕疵去除

Apache flex 数字图像中的瑕疵去除,apache-flex,image,Apache Flex,Image,我目前正在使用Flex编写一个图像编辑应用程序,我正在尝试像picnik.com那样实现一个瑕疵消除功能 我到处找了,但什么也没找到。 适合这种情况的最佳方式是什么 我试着把瑕疵模糊掉,但效果很差。你没有得到任何其他答案,所以我会试试看。我对flex一无所知,但这应该是可行的: 1) 用户选择一个区域(为了论证,它是一个圆) 2) 求圆边缘的颜色值的平均值并存储该颜色 3) 在图像和计算出的周长平均颜色之间进行高斯混合。也就是说,混合圆的中心远多于边缘。当你越来越接近边缘时,混合量应该会逐渐消失

我目前正在使用Flex编写一个图像编辑应用程序,我正在尝试像picnik.com那样实现一个瑕疵消除功能

我到处找了,但什么也没找到。 适合这种情况的最佳方式是什么


我试着把瑕疵模糊掉,但效果很差。

你没有得到任何其他答案,所以我会试试看。我对flex一无所知,但这应该是可行的:

1) 用户选择一个区域(为了论证,它是一个圆)

2) 求圆边缘的颜色值的平均值并存储该颜色

3) 在图像和计算出的周长平均颜色之间进行高斯混合。也就是说,混合圆的中心远多于边缘。当你越来越接近边缘时,混合量应该会逐渐消失。这可以防止你的图像上出现模糊的圆形。这也将有助于防止变暗,因为瑕疵颜色不会是平均过程的一部分

祝你好运

编辑

下面是有关混合操作的一些psudocode

for (each pixel)
{
   blendingConstant = [A number between zero and one which is close 
   to 1.0 near the edge of the circle, and approaches a threshold 
   value the closer you get to the center];

   pixelColor = (blendingConstant * pixelColor + ( 1.0 - blendingConstant  ) * averagePerimiterColor);
}
阈值可以是零,也可以不是。你必须一直玩到它看起来合适为止

function removeblemish(e:MouseEvent):void
{

var半径=16;
var mX:Number=e.localX;
变量mY:Number=e.localY;
var-ar=0,ag=0,ab=0;
var-cnt=0;
对于(变量i:int=0;i<360;i++)
{
var弧度:数值=i*Math.PI/180.0;
var posX:Number=Math.floor(半径*Math.cos(弧度))+mX;
var posY:Number=Math.floor(半径*Math.sin(弧度))+mY;
如果(posX>=0&&posX=0&&posY>16)&0xFF;
ag+=(像素>>8)&0xFF;
ab+=(像素>>0)&0xFF;
碳纳米管++
}
}
ar=数学地板(ar/cnt)%255;
ag=数学地板(ag/cnt)%255;
ab=数学地板(ab/cnt)%255;
风险值阈值:数值=0.75;
对于(变量i:int=0;i=0&&posX=0&&posY>16)&0xFF;
var cg=(像素>>8)&0xFF;
var cb=(像素>>0)&0xFF;
cr=数学地板(混合*cr+(1.0-混合)*ar)%255;
cg=数学地板(混合*cg+(1.0-混合)*ag)%255;
cb=数学地板(混合*cb+(1.0-混合)*ab)%255;

newBitmap.setPixel32(posX,posY,(255)为什么结果不好?你能详细说明你做了什么吗?我把它们模糊后得到了模糊的矩形或圆形。模糊的部分比周围的颜色更暗。我发现了这项技术的专利:你可能想小心避免这种方法或支付版税。嗯,我已经在pe上得到了颜色rimeter,但我不知道如何进行混合。是否有一些算法或伪代码?请参阅我的编辑。希望有帮助。如果您需要更多详细信息或它不起作用,请告诉我。以像素为单位的圆有多小?瑕疵是否与周长重叠?顺便说一句,一定有更好的方法迭代圆中的像素。您的这可能会导致错误。介于0和360之间不仅浪费周期,还会中断数学计算。请尝试在(mx+-radius)和(my+-radius)之间迭代。然后进行测试,查看像素是否在圆内或周长上,具体取决于循环。
var radius = 16;

var mX:Number = e.localX;
var mY:Number = e.localY;

var ar = 0, ag = 0, ab = 0;
var cnt = 0;

for(var i:int = 0; i < 360; i++)
{
    var radians:Number = i *  Math.PI / 180.0;

    var posX:Number = Math.floor(radius * Math.cos(radians)) + mX;
    var posY:Number = Math.floor(radius * Math.sin(radians)) + mY;

    if(posX >= 0 && posX < newBitmap.width && posY >= 0 && posY < newBitmap.height)
    {
        var pixel:uint = newBitmap.getPixel32(posX, posY);
        ar += (pixel >> 16) & 0xFF;
        ag += (pixel >> 8) & 0xFF;
        ab += (pixel >> 0) & 0xFF;
        cnt++
    }
}

ar = Math.floor(ar / cnt) % 255;
ag = Math.floor(ag / cnt) % 255;
ab = Math.floor(ab / cnt) % 255;

var threshold:Number = 0.75;

for(var i:int = 0; i <= radius; i++)
{
    for(var j:int = 0; j < 360; j++)
    {
        var radians:Number = j *  Math.PI / 180.0;

        var posX:Number = Math.floor(i * Math.cos(radians)) + mX;
        var posY:Number = Math.floor(i * Math.sin(radians)) + mY;

        if(posX >= 0 && posX < newBitmap.width && posY >= 0 && posY < newBitmap.height)
        {
            var blend = threshold + (i * 1.0 / radius) * (1.0 - threshold);

            var pixel:uint = newBitmap.getPixel32(posX, posY);
            var cr = (pixel >> 16) & 0xFF;
            var cg = (pixel >> 8) & 0xFF;
            var cb = (pixel >> 0) & 0xFF;

            cr = Math.floor(blend * cr + (1.0 - blend) * ar) % 255;
            cg = Math.floor(blend * cg + (1.0 - blend) * ag) % 255;
            cb = Math.floor(blend * cb + (1.0 - blend) * ab) % 255;

            newBitmap.setPixel32(posX, posY, (255 << 24) | (cr << 16) | (cg << 8) | cb);
        }
    }
}