segmentacion procesamiento laplaciano imagenes imagen filtro ejemplos deteccion contraste con bordes aumentar c++ opencv image-processing computer-vision

c++ - procesamiento - segmentacion de imagenes pdf



Segmentación de imagen de bajo contraste (3)

Tengo un problema con la segmentación de imágenes de bajo contraste. La tarea es encontrar defectos superficiales. Son visibles (los defectos son siempre áreas oscuras) pero el contraste de la imagen es muy bajo. Debajo de dos muestras

He intentado mejorar el contraste y luego no creerlo:

Mat tmp1 = imread("C://framesRoi//311.bmp",0); stretchContrast(tmp1); threshold(tmp1,tmp1,75,255,THRESH_BINARY);

donde stretch stretch impl:

int minValue = 255, maxValue = 0; const int l = sourceImg.cols * sourceImg.rows * sourceImg.channels(); if(sourceImg.isContinuous()) { uchar* ptr = sourceImg.ptr<uchar>(0); for(int i = 0; i < l; ++i) { if(ptr[i] < minValue) { minValue = ptr[i]; } if(ptr[i] > maxValue) { maxValue = ptr[i]; } } } cout<<"min: "<<minValue<<";"<<"max value: "<<maxValue<<endl; const int magicThreshold = 10; if(sourceImg.isContinuous()) { uchar* ptr = sourceImg.ptr<uchar>(0); for(int i = 0; i < l; ++i) { ptr[i] = 255 * (ptr[i]-minValue)/(maxValue - minValue); } }

Pero este enfoque falló. Hay muchas detecciones falsas y no se detectan todos los defectos:

Aquí está zip con marcos de prueba: https://dl.dropboxusercontent.com/u/47015140/testFrames.rar


Intente agrupar la imagen por nivel de grises usando un método de agrupamiento como kmeans. A continuación he usado kmeans directamente en las imágenes sin ninguna transformación de nivel de grises (el uso de 3 clústeres me dio mejores resultados). Debería poder mejorar los resultados al agrupar una imagen preprocesada utilizando los métodos descritos en los comentarios.

La forma de los conglomerados puede variar ligeramente debido a la aleatoriedad de kmeans.

Ahora, si toma los componentes conectados de la imagen agrupada y calcula el nivel de gris promedio de esas regiones, los defectos deberían tener un promedio menor que las otras regiones.

Hice una parte de agrupamiento en Matlab.

im = imread(''r2SOV.png'');%Uy1Fq r2SOV gr = im; size = size(gr); % perform closing using a 5x5 circular structuring element sel = strel(''disk'', 2, 4); mcl = imclose(gr, sel); % cluster gray levels using kmeans: using 3 clusters x = double(mcl(:)); idx = kmeans(x, 3); cl = reshape(idx, size); figure, imshow(label2rgb(cl))


Creo que deberías probar la función adaptiveThreshold con una gran ventana.

#include "opencv2/opencv.hpp" using namespace cv; int main(int argc,char** argv ) { Mat im = imread("c:/data/img1.png",0); cv::namedWindow("ctrl"); int win=62; int th=2100; cv::createTrackbar( "win", "ctrl", &win, 500); cv::createTrackbar( "th", "ctrl", &th, 10000); while(true) { Mat thresh; medianBlur(im,thresh,15);//helps smooth out smaller noises, which you could also remove by size instead of this way adaptiveThreshold(thresh,thresh,255,ADAPTIVE_THRESH_MEAN_C,THRESH_BINARY,win*2+1,( th/1000.)); imshow("thresh",thresh); if(waitKey(1)==27) exit(0); } }

todos los resultados aquí ( http://www.datafilehost.com/d/99e3d86c ) También es posible que desee echar un vistazo a imagej que implementa un grupo de algoritmos de umbral automático. Creo que lo que necesitas es algo que tenga en cuenta la información de la imagen local.


Como dijo la gente en tu comentario, puedes cambiar el brillo de una manera negativa y subir el contraste.

Además, el filtro de nitidez también es muy útil para su caso. Puedes hacer esto en OpenCV.