2014-12-03 2 views
12

저 대비 이미지 분할에 문제가 있습니다. 작업은 표면 결함을 찾는 것입니다. 그들은 보이지만 (결함은 항상 어두운 영역 임) 이미지의 대비가 매우 낮습니다. 두 개 샘플 아래. 저 대비 이미지 세분화

1 내가 대비를 강화하려하고 tresholding 한 2

:

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

스트레치 대비 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); 
    } 
} 

그러나이 방법은 실패했습니다. 이 많은 거짓 탐지는 모든 결함이 감지되지 : 여기 3

테스트 프레임 우편입니다 : 사람들이 당신의 코멘트에 말했듯이 https://dl.dropboxusercontent.com/u/47015140/testFrames.rar

+1

, 당신은 유용한 임계 값을 선택하는 데 필요한 컨텍스트를 잃게됩니다. –

+0

@ MarkRansom : 어떻게해야합니까? – krzych

+2

결함이 항상 어둡다는 것을 안다면 밝은 영역이 일치하도록 대비를 변경하지 않고 밝기를 조정할 수 있습니다. 90 번째 백분위 수를 사용하면 노이즈에 덜 취약하지만 최대치로 할 수 있습니다. –

답변

8

kmeans와 같은 클러스터링 방법을 사용하여 이미지를 회색조로 클러스터링 해보십시오. 아래에서는 회색 레벨 변환없이 이미지에 직접 kmeans를 사용했습니다 (3 클러스터를 사용하면 더 나은 결과를 얻을 수있었습니다). 주석에 설명 된 방법을 사용하여 사전 처리 된 이미지를 클러스터링하여 결과를 향상시킬 수 있어야합니다. 클러스터의

enter image description here enter image description here

형상은 다소 kmeans의 무작위로 변할 수있다.

이제 클러스터 된 이미지의 연결된 구성 요소를 가져 와서 해당 영역의 평균 회색조를 계산하면 결함의 평균이 다른 영역보다 낮아야합니다.

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)) 
+0

우수 답변 soo 멀리. 현상금이 만료 될 때까지 기다렸다가 최선의 대답을 받아 들일 것입니다. – krzych

4

, 당신은 부정적으로 밝기를 변경하고 밀어 수 대조.

또한 sharpen filter도 매우 유용합니다. OpenCV에서 this을 할 수 있습니다.

4

큰 창이있는 adaptiveThreshold 기능을 사용해보십시오. 여기

#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); 
    } 
} 

모든 결과 (http://www.datafilehost.com/d/99e3d86c)는 또한 자동 임계 값 알고리즘의 무리를 구현 ImageJ에 살펴 할 수 있습니다. 로컬 이미지 정보를 고려하는 것이 필요하다고 생각합니다. 당신은 이미지 내용에 따라 대비 스트레칭을 수행 할 때

enter image description here enter image description here

관련 문제