我需要计算UIImage对象中图像的标准差。 我已经知道如何逐个访问图像的所有像素,因此可以进行计算。 我想知道是否在框架中有更好、更有效的函数来执行此操作...我找不到它,所以也许它不存在。 有人知道如何做吗? 再见
我需要计算UIImage对象中图像的标准差。 我已经知道如何逐个访问图像的所有像素,因此可以进行计算。 我想知道是否在框架中有更好、更有效的函数来执行此操作...我找不到它,所以也许它不存在。 有人知道如何做吗? 再见
Accelerate
框架。如果您的图像只有几百像素乘以数百像素,您将有大量数据需要处理,Accelerate
以及vDSP
将使所有这些数学计算更快,因为它在GPU上处理所有内容。我将进一步深入研究,并可能在几分钟内放置一些代码。
更新
我将发布一些代码,使用vDSP
在单个维度上执行标准偏差,但这绝对可以扩展到2-D。 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
// 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;
}
然后通过以下方式计算色调值的标准差:
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;
}