¿Cómo determinar automáticamente el umbral óptimo para la binarización de imágenes?

El umbral divide la imagen original en dos imágenes: primer plano y fondo. \x0d\Foreground: use n1, csum, m1 para representar el número de puntos de primer plano, el momento de masa y el nivel de gris promedio por debajo del umbral actual. \x0d\ Background: use n2, sum-csum, m2 para representar el fondo debajo del. umbral actual. El número de puntos, momento de masa, nivel de gris promedio\x0d\Al tomar el umbral óptimo, el fondo debe ser el más diferente del primer plano. La clave está en cómo elegir el estándar para medir la diferencia\x0d\. En el algoritmo otsu, el estándar para medir la diferencia es la varianza entre clases más grande (abreviatura en inglés otsu, que es el origen del nombre de este algoritmo)\x0d\En este programa, la varianza entre clases está representada por sb, y la varianza máxima entre clases está representada por fmax\x0d\ Acerca del rendimiento del método de varianza máxima entre clases (otsu):\x0d\El método de varianza entre clases es muy sensible al ruido y al tamaño del objetivo. solo produce mejores resultados de segmentación para imágenes con variación unimodal entre clases. \x0d\ Cuando la relación de tamaño entre el objetivo y el fondo es muy diferente, la función de criterio de variación entre clases puede mostrar picos dobles o picos múltiples. En este momento, el efecto no es bueno, pero el método de variación entre clases. es el que menos tiempo requiere. \x0d\La derivación de la fórmula del método de varianza máxima entre clases (otsu): \x0d\Recuerde t como el umbral de segmentación del primer plano y el fondo, la proporción del número de puntos de primer plano en la imagen es w0, el gris promedio el nivel es u0; la proporción del número de puntos de fondo en la imagen es w1, el nivel de gris promedio es u1. \x0d\Entonces la escala de grises promedio total de la imagen es: u=w0*uw1*u1.

\x0d\La variación de las imágenes de primer plano y de fondo: g=w0*(u0-u)*(u0-u)+w1*(u1-u)*(u1-u)=w0*w1*(u0-u1 ) *(u0-u1), esta fórmula es la fórmula de la varianza, puede consultar el libro de texto de teoría de la probabilidad\x0d\La fórmula de g anterior también es la expresión de sb en el siguiente programa\x0d\Cuando la varianza g es la más grande, la perspectiva se puede considerar en este momento. La mayor diferencia con el fondo es que la escala de grises en este momento es el mejor umbral\x0d\\x0d\unsafepublicintGetThreshValue(Bitmapimage)\x0d\{\x0d\BitmapDatabd=image.LockBits( newRectangle(0,0,image.Width,image .Height),ImageLockMode.WriteOnly,image.PixelFormat);\x0d\byte*pt=(byte*)bd.Scan0;\x0d\int[]pixelNum=newint[256 ];//Histograma de imagen, ** *256 puntos\x0d\bytecolor;\x0d\byte*pline;\x0d\intn,n1,n2;\x0d\inttotal;//total es el total, el valor acumulado\x0d \doublem1,m2,sum,csum,fmax ,sb;//sb es la varianza entre clases, fmax almacena el valor máximo de varianza\x0d\intk,t,q;\x0d\intthreshValue=1;//threshold\x0d \intstep=1;\x0d\switch(image. PixelFormat)\x0d\{\x0d\casePixelFormat.Format24bppRgb:\x0d\step=3;\x0d\break;\x0d\casePixelFormat.Format32bppArgb:\x0d\step=4 ;\x0d\break;\x0d\casePixelFormat.Format8bppIndexed :\x0d\step=1;\x0d\break;\x0d\}\x0d\//Generar histograma\x0d\for(inti=0;i255)\x0d\ q=255;\x0d\total=total+ pixelNum[q];//total es el valor total acumulado\x0d\}\x0d\pixelNum[k]=(int)((float)total/5.0.5); //Suavizado, 2 a la izquierda + 1 en el medio + 2 escalas de grises a la derecha, ***5, por lo que la suma se divide entre 5 y luego se suma 0,5 para usar el valor de corrección\x0d\}\x0d\ //Para encontrar el umbral\x0d\sum=csum=0.0;\x0d\ n=0;\x0d\//Calcula el número total de puntos de la imagen y momentos de masa para prepararte para cálculos posteriores\x0d\for(k=0 ;kfmax)//Si la varianza entre clases calculada es mayor que la varianza entre clases calculada anteriormente\x0d\{\x0d\fmax=sb;//fmax es siempre la varianza entre clases máxima (otsu)\x0d\ threshValue=k;//El k del nivel de gris correspondiente al tomar la variación máxima entre clases es el mejor Threshold\x0d\}\x0d\}\x0d\image.UnlockBits(bd);\x0d\image.Dispose( );\x0d\returnthreshValue;\x0d\}