La segmentación rápida de imágenes requiere muy poco tiempo algoritmos de segmentación tradicionales

La segmentación rápida de imágenes lleva menos tiempo que los algoritmos de segmentación tradicionales</trp-post-container

514KBZIP

matlab tiene que encontrar el valor extremo de la función findpeak sólo puede encontrar un valor extremo unidimensional, y opencv no tiene función correspondiente, el llamado valor extremo es mayor que los valores circundantes, y luego ver qué grado de demanda para el valor extremo: para la adhesión de la meta, yo uso este método de valor extremo para averiguar el valor extremo y luego + segmentación de cuenca, el efecto es mejor que los métodos de segmentación que he probado antes, pero también simple y consume mucho tiempo menos.

Mat dist_image,eachpeaks,peaksshow.

distanceTransform(bwimg,dist_image, DIST_L2, 3);



vector<Punto> picos.

findPeaks(dist_image,lengthresh,peaks,eachpeaks).



Mat imglabels,segresult.

watershedSegmentProc(bwimg,eachpeaks,peaksshow,imglabels,segresult);

Los puntos del área central encontrados de este modo son más precisos y, por tanto, hay menos sobresegmentación cuando se divide la cuenca.

Sin embargo, este enfoque debería optimizarse un poco más, ya que los polos encontrados de esta manera no son amigables para un único gran objetivo, que encontrará varios polos. En cuanto al código optimizado, no lo publicaré (para uso interno de la empresa).

Una pega: al depurar hoy, ¿cómo es que los resultados de las cuencas seguían teniendo áreas desconocidas sin asignar?

Es sorprendente que aquí haya valores en la región 0-desconocida, claramente el resultado después de que la cuenca ya se haya creado:

/* Tratamiento de la división de la cuenca

* srcmatbw-------- mapa binario Canal único

* everycenters---- mapa central de piedras divisibles con 0 negro en el fondo y punto blanco 255 en el centro

* imglabels------- watershed result fondo es 100, línea divisoria es -1, piedras divisibles son 1~N (puede tener 0 ya tolerado)

* */

int watershedSegmentProc(Mat &srcmatbw,Mat &everycenters,Mat &imglabels)

{

// int not_zero_count=countNonZero(srcmatbw);

// float white_count_thre=srcmatbw.rows*srcmatbw.cols;

// white_count_thre*=0.8;

// if((not_zero_count(int)white_count_thre))

//	{

// devuelve 2;

//	}

 

	Mat element = getStructuringElement(MORPH_ELLIPSE, Size(11, 11));

Mat element2 = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));



Mat binary_dilate.//todos los centros

	dilate(everycenters, binary_dilate, element2, Point(-1, -1), 1);



Mat binary_8UC3.

vector resultmats.

resultmats.push_back(srcmatbw);

resultmats.push_back(srcmatbw); resultmats.push_back(srcmatbw).

resultmats.push_back(srcmatbw); resultmats.push_back(srcmatbw).

merge(resultmats,binary_8UC3);



Mat desconocido.//Obtener el área desconocida, es decir, el área implicada en la demarcación de la línea divisoria.

	bitwise_xor(srcmatbw,binary_dilate,unknown).

 

	//Fusionar imágenes de marcadores

	Mat imgstats, imgcentroid.

connectedComponentsWithStats(binary_dilate, imglabels, imgstats, imgcentroid);  //Marcadores de campo de conectividad

 

	imglabels.convertTo(imglabels, CV_32SC1); // Conversión del tipo de imagen

 

	imglabels = imglabels + 100;//El área de fondo es de 100 píxeles

 

	para (int i=0;i<desconocido.filas;i++)

{

uchar* ptr = unknown.ptr(i);

		para (int j=0;j<desconocido.cols;j++)

{

			si (255==ptr[j])

{

imglabels.at(i, j) = 0; // Los píxeles del área desconocida son 0

			}

		}

	}

 

	//Segmentación de cuencas

	watershed(binary_8UC3, imglabels).

}

¿Qué pasa con ese 0 que no sé?

/**********************************************************************/

Respecto a opencv 4.1 llamando a modelos .pb entrenados en tensorflow con nodos DropOut o BatchNorm, un nuevo colega me dijo que opencv c++ no lo soporta, lo he comprobado:

Exportar grafico tensorflow con batchnorm a opencv dnn - Foro de preguntas y respuestas de OpenCV

OpenCV: modules/dnn/src/tensorflow/tf_importer.cpp | Fossies

dnn: Tipo de capa desconocido Shape en op dropout/Shape en función populateNet - Problema #9563 - opencv/opencv - GitHub

Como cargar un modelo Keras construido con tensorflow backend en OpenCV - OpenCV Q&A Forum

Tensorflow C++ del entrenamiento al despliegue (3): Entrenamiento y despliegue de CNNs con Keras - Tech Liu

C++ y el nodo phase_train - Problema #357 - davidsandberg/facenet - GitHub

Comprobado el código fuente opencv4.1, ver está escrito fushBatchNorm interfaz, si no es compatible, entonces opencv por qué escribir esta interfaz, no costillas de pollo:

Mira, sí reconoce este nodo de. Creo que sólo tiene que ser la forma en que opencv c++ especifica antes de llegar a cargar el modelo entrenado bajo python.

En cuanto al nodo dropout, de momento no lo veo en el código fuente de opencv, pero he visto soluciones de las que se habla en internet:

Y otro chico incluso escribió el código para entrenar el modelo con nodos de abandono en python y luego opencv c ++ llamadas.

Así que no creo que estos no son compatibles, opencv c ++ es sólo un poco más estrictas que bajo python, y se cargará por sus reglas, sólo estamos todavía en nuestro camino para averiguar ellos.

Hoy, he encontrado información muy útil sobre segmentación de imágenes sobre el muro, pero desafortunadamente no hay código correspondiente, hay uno particularmente bueno que habla sobre segmentación de objetivos irregulares superpuestos por coincidencia o ajuste de formas.

Espero tener tiempo para implementarlo en otro proyecto. Abajo está el resultado de la tesis: ¡creo que funciona mejor para diagramas muy superpuestos y desenfocados!

Descarga de recursosEl precio de descarga de este recurso es de56.0Monedas de oro, por favor, primero
Descarga de recursos
Descargar precios56.0 monedas

Declaración de recursos (la compra se considera un acuerdo con esta declaración):
1. Cualquier operación en la plataforma del sitio web se considera que han leído y aceptado la parte inferior del acuerdo de registro del sitio web y renuncia de responsabilidad, los recursos de este sitio han sido ultra-bajo precio, y no proporciona soporte técnico
2. Algunos usuarios de la red comparten la dirección de disco neto puede no ser válida, como la aparición de fallos, por favor envíe un correo electrónico al servicio al cliente code711cn#qq.com (sustituir # con @) se compondrá de enviar
¡3. Este sitio proporciona todos los recursos descargables (software, etc) sitio para asegurarse de que no hay cambios negativos, pero este sitio no puede garantizar la exactitud, seguridad e integridad de los recursos, las descargas de los usuarios a su propia discreción, nos comunicamos a aprender con el fin de no todo el código fuente no es 100% libre de errores o sin errores, es necesario tener una cierta base para poder leer y entender el código, para poder modificar la depuración! código y resolver errores. Al mismo tiempo, los usuarios de este sitio deben entender que la Source Code Convenience Store no posee ningún derecho sobre el software proporcionado para su descarga, los derechos de autor pertenecen al propietario legal del recurso.
¡4. Todos los recursos en este sitio sólo para fines de aprendizaje y de investigación, por favor debe ser eliminado dentro de las 24 horas de los recursos descargados, no utilice con fines comerciales, de lo contrario los conflictos legales derivados del sitio y el editor del sitio de responsabilidad colateral y no se llevará a cabo!
5. Debido a la naturaleza reproducible de los recursos, una vez adquiridos no son reembolsables, el saldo de recarga tampoco lo es.

充值送金币,用余额购买,低至6.7折!Recargar ahora

Mostrar CAPTCHA