c++ कम विपरीत छवि विभाजन



विधिक शब्दावली (3)

मुझे लगता है कि आपको बड़ी विंडो के साथ 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 पर भी एक नज़र डाल सकते हैं जो स्वत: थ्रेशोल्ड एल्गोरिदम का एक गुच्छा लागू करता है। मुझे लगता है कि आपको जो कुछ चाहिए, वह कुछ है जो स्थानीय छवि जानकारी को ध्यान में रखती है

मुझे कम विपरीत छवि विभाजन के साथ समस्या है कार्य को सतह दोष मिलना है वे दिखाई दे रहे हैं (दोष हमेशा अंधेरे क्षेत्र हैं) लेकिन छवि के विपरीत बहुत कम है नीचे दो नमूने

मैंने इसके विपरीत और फिर ट्रेसहोल्डिंग बढ़ाने की कोशिश की है:

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

जहां खिंचाव पर विपरीत असर:

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

लेकिन यह दृष्टिकोण असफल रहा। कई गलत निंदाएं हैं और सभी दोष नहीं पाए जाते हैं:

यहां परीक्षण फ़्रेम के साथ ज़िप है: https://dl.dropboxusercontent.com/u/47015140/testFrames.rar


कमेन्टिंग विधि जैसे किमेन्स के उपयोग से ग्रे स्तर के द्वारा छवि को क्लस्टरिंग करने का प्रयास करें नीचे मैंने कैमरे को बिना किसी भूरे रंग के परिवर्तनों के चित्रों पर सीधे इस्तेमाल किया है (3 समूहों का उपयोग करके मुझे बेहतर परिणाम मिला) आपको टिप्पणियों में उल्लिखित विधियों का उपयोग करके एक प्रीप्रोसेड छवि क्लस्टरिंग करके परिणाम सुधारने में सक्षम होना चाहिए।

कमेन्ट्स की यादृच्छिकता के कारण समूहों का आकार थोड़ा भिन्न हो सकता है।

अब अगर आप क्लस्टर छवि के जुड़े घटक लेते हैं और उन क्षेत्रों के औसत भूरे स्तर की गणना करते हैं, तो दोषों के अन्य क्षेत्रों की तुलना में कम औसत होना चाहिए।

मैंने मैटलैब में भाग को क्लस्टर किया था

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

जैसा कि लोग आपकी टिप्पणी में कहते हैं, आप एक नकारात्मक तरीके से चमक को बदल सकते हैं और इसके विपरीत देख सकते हैं।

इसके अलावा, आपके केस के लिए तेज फ़िल्टर भी बहुत उपयोगी है। आप इसे OpenCV में कर सकते हैं





computer-vision