Ios UIImage/CGImage的标准偏差

Ios UIImage/CGImage的标准偏差,ios,uiimage,standard-deviation,Ios,Uiimage,Standard Deviation,我需要计算UIImage对象内部图像的标准偏差。 我已经知道如何访问图像的所有像素,一次一个,所以我可以以某种方式做到这一点。 我想知道框架中是否有一个函数可以更好、更有效地执行此操作。。。我找不到,所以可能它不存在。 有人知道怎么做吗? 再会进一步阐述我的上述评论。我肯定会考虑使用Accelerate框架,尤其是根据图像的大小。如果你的图像是几百像素乘几百像素。您将有大量数据要处理,加速以及vDSP将使所有的数学运算速度大大加快,因为它在GPU上处理所有数据。我将进一步研究这一点,并可能在几分

我需要计算UIImage对象内部图像的标准偏差。 我已经知道如何访问图像的所有像素,一次一个,所以我可以以某种方式做到这一点。 我想知道框架中是否有一个函数可以更好、更有效地执行此操作。。。我找不到,所以可能它不存在。 有人知道怎么做吗?
再会

进一步阐述我的上述评论。我肯定会考虑使用
Accelerate
框架,尤其是根据图像的大小。如果你的图像是几百像素乘几百像素。您将有大量数据要处理,
加速
以及
vDSP
将使所有的数学运算速度大大加快,因为它在GPU上处理所有数据。我将进一步研究这一点,并可能在几分钟内编写一些代码

更新

我将发布一些代码,使用
vDSP
在单个维度上进行标准偏差,但这肯定可以扩展到二维

 float *imageR =  [0.1,0.2,0.3,0.4,...]; // vector of values
 int numValues = 100; // number of values in imageR
 float mean = 0; // place holder for mean
 vDSP_meanv(imageR,1,&mean,numValues); // find the mean of the vector
 mean = -1*mean // Invert mean so when we add it is actually subtraction
 float *subMeanVec  = (float*)calloc(numValues,sizeof(float)); // placeholder vector
 vDSP_vsadd(imageR,1,&mean,subMeanVec,1,numValues) // subtract mean from vector
 free(imageR); // free memory 
 float *squared = (float*)calloc(numValues,sizeof(float)); // placeholder for squared vector
 vDSP_vsq(subMeanVec,1,squared,1,numValues); // Square vector element by element
 free(subMeanVec); // free some memory
 float sum = 0; // place holder for sum
 vDSP_sve(squared,1,&sum,numValues); sum entire vector
 free(squared); // free squared vector
 float stdDev = sqrt(sum/numValues); // calculated std deviation

请解释你的疑问,以便能给出具体的答复

如果我说得对,那么你想计算像素的RGB或颜色的HSV的标准偏差,你可以在HSV和RGB的情况下框定你自己的标准偏差方法

我们可以通过包装这些值来实现这一点。 例如,[358,2]度的平均值为(358+2)/2=180度。 但这是不正确的,因为它的平均值应该是0度。 所以我们把358包成-2。 现在答案是0。 所以,你们必须应用包装,然后你们可以计算标准偏差从上述链接

更新: 将RGB转换为HSV

    // r,g,b values are from 0 to 1 // h = [0,360], s = [0,1], v = [0,1]
//  if s == 0, then h = -1 (undefined)

void RGBtoHSV( float r, float g, float b, float *h, float *s, float *v )

{
 float min, max, delta;   
    min = MIN( r, MIN(g, b ));   
    max = MAX( r, MAX(g, b ));   
    *v = max;  
    delta = max - min;   
    if( max != 0 )  
        *s = delta / max;  
    else {   
        // r = g = b = 0   
        *s = 0;   
        *h = -1;   
        return; 
    }
    if( r == max )
        *h = ( g - b ) / delta; 
    else if( g == max )
        *h=2+(b-r)/delta;
    else 
        *h=4+(r-g)/delta; 
    *h *= 60;
    if( *h < 0 ) 
        *h += 360;
}
//r、g、b的值从0到1//h=[0360],s=[0,1],v=[0,1]
//如果s==0,则h=-1(未定义)
无效RGBtoHSV(浮子r、浮子g、浮子b、浮子*h、浮子*s、浮子*v)
{
浮动最小值、最大值、增量;
min=min(r,min(g,b));
max=max(r,max(g,b));
*v=最大值;
增量=最大-最小值;
如果(最大!=0)
*s=增量/最大值;
否则{
//r=g=b=0
*s=0;
*h=-1;
返回;
}
如果(r==最大值)
*h=(g-b)/delta;
else如果(g==最大值)
*h=2+(b-r)/delta;
其他的
*h=4+(r-g)/delta;
*h*=60;
如果(*h<0)
*h+=360;
}
然后通过以下公式计算色调值的标准偏差:

double calcStddev(ArrayList<Double> angles){
  double sin = 0;
  double cos = 0;
  for(int i = 0; i < angles.size(); i++){
       sin += Math.sin(angles.get(i) * (Math.PI/180.0));
       cos += Math.cos(angles.get(i) * (Math.PI/180.0)); 
  }
  sin /= angles.size();
  cos /= angles.size();

  double stddev = Math.sqrt(-Math.log(sin*sin+cos*cos));

  return stddev;
double-calcstdev(数组列表角度){
双正弦=0;
双cos=0;
对于(int i=0;i

}

你可能必须自己写,特别是考虑到它必须是二维标准偏差,希克里希纳!我的照片是一张正方形的照片。我需要把它分成几个较小的正方形,我需要一种方法来识别和删除那些只包含一种统一颜色的较小正方形。。。出于这个原因,我考虑计算标准偏差,以便定义一个threshold和dischard。你可以计算所有小正方形像素的色调,然后计算标准偏差,并根据你的适用性设置阈值(接近零)。色调值为[0360]。谢谢!这是一个有趣的起点!我会试试。。。事实上,我不知道vDSP框架…是的,应该可以正常工作。这是一维标准差的直接公式,所以你需要做一些矢量处理,才能将2D图像转换成一维,但除此之外,可能还有我代码中的一些拼写错误,你应该会做得很好。