Einzelnen Beitrag anzeigen
Alt 26.09.2010, 15:19   #6 (permalink)
kanonenfutter
Extrem Tweaker
 
Benutzerbild von kanonenfutter
 

Registriert seit: 10.07.2006
Beiträge: 2.290

kanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblickkanonenfutter ist ein Lichtblick

Standard AW: [C++] Problem bei Denkaufgabe

Also das Teilprogramm läuft 1A, danke nochmal dafür

Nun wollte ich die gleiche Idee des einstellbaren Wertes mittels Schieberegler bei einem anderen Teilprogramm verwenden. Dabei geht es um die Binarisierung eines Bildes, heißt die Darstellung des Bildes nur mithilfe von schwarzen oder weißen Pixeln. Von einem s/w-Bild werden dabei die Grauwerte jeden Pixels ausgelesen und dann mit einem Schwellwert verglichen. Liegt der Pixelwert darunter wird er auf 0, darüber auf 255 gesetzt. Diesen Schwellwert würde ich ebenfalls gern mit einem solchen Balken einstellen. Einzige Umstellung ist, dass der Wert nun nicht von 0 bis 1 sondern von 0 bis 255 läuft (integer).

Gut, eigentlich kein Problem, habe die Idee von oben genommen, etwas abgeändert und, naja, habe mal wieder ein problem...

Mal abgesehen davon das ich mal wieder noch nicht sicher bin wie ich den Wert über die y-Mauposition errechnen soll, habe ich das Problem, dass mein Balken nicht ordentlich gezeichnet wird. Meiner Meinung nach müsste die Formel im Code richtig sein, nur scheint mir das Programm dort einige Klammern zu unterschlagen, und zeigt somit den Balken immer bei Position 0 an (für gwin = Grauwertschwelle = 0 bis 254), ab 255 wird der balken voll bis nach oben gezeichnet. Heißt für die Berechnung von 1 bis 254 läuft irgendwas schief...

Hier direkt mal der aktuelle Quelltext dazu:

Code:
#include "CImg.h"
using namespace cimg_library;

int main()
{
    CImg<int>img("lena.jpg");
    CImg<int>gimg(img.width(), img.height(), 1, 3, 0);
    CImg<int>bimg(img.width(), img.height(), 1, 3, 0);
    CImgList<double>visu(bimg, CImg<int>(100,600,1,3,0));
    CImgDisplay disp(visu,"Test");
    //disp.resize(disp.screen_width()-20, 600*(disp.screen_width()-20)/1700, false);
    
    int valR, valG, valB = 0;
    double avg = 0.0;
    int tsize = 24;
    double upperOffset = tsize+25;
    double lowerOffset = 600-tsize-25;
    double offsetMod =  2;

    const unsigned char white[] = {255,255,255};    
    const unsigned char blue[] = {0,0,255};    
    const unsigned char lblue[] = {0,0,192};    
    const unsigned char dblue[] = {0,0,128};

    for (int gwin = 128; !disp.is_closed() && !disp.is_keyQ() && !disp.is_keyESC(); ) 
    {
        for(int x = 0; x < img.width(); x++)        //Schleife über x,y und Farbkanal
        {
            for(int y = 0; y < img.height(); y++)
            {
                valR = img(x,y,0,0);                    // Read the red component
                valG = img(x,y,0,1);                    // Read the green component
                valB = img(x,y,0,2);                    // Read the blue component (Z-coordinate omitted here).
                avg = (valR + valG + valB)/3;            // Compute average pixel value.

                gimg(x,y,0,0) = gimg(x,y,0,1) = gimg(x,y,0,2) = avg;    //Graubild
                
                if(avg>=gwin)            //Binarisierung
                {
                    visu[0](x,y,0) = visu[0](x,y,1) = visu[0](x,y,2) = 255;
                }
                else visu[0](x,y,0) = visu[0](x,y,1) = visu[0](x,y,2) = 0;
            }
        }

        visu[1].fill(0).draw_text(18,5,"Grenze",white,0,1,tsize).
            draw_text(36,600-tsize-5,"%d",white,0,1,tsize,gwin);
        visu[0].draw_line(img.width()-1,0,img.width()-1,img.height(),white,1);
    
        double pro = gwin / 255;
        const int yb = (int)(lowerOffset-(pro*(600-offsetMod*upperOffset)));        // ???
    
        visu[1].draw_rectangle(38, 600-tsize-23, 62, tsize+23, lblue, 1).
        draw_rectangle(39, 600-tsize-24, 61, tsize+24, dblue, 1).draw_rectangle(40, 600-tsize-25, 60, yb, blue, 1);
    
        if ((disp.button()) && (disp.mouse_x()>=img.width() + 38) && (disp.mouse_x()<=img.width() + 62) && 
            (disp.mouse_y()>=tsize + 25) && (disp.mouse_y()<=600-tsize-25))
        {
            gwin = (int)(600 -disp.mouse_y() -(tsize+25));        // ???

            if(gwin>255)
            {
                gwin = 255;
            }
        }

        disp.resize(disp,false).display(visu).wait();
    }
}
Und hier noch ein Bildchen zur Veranschaulichung:

http://www.tweakpc.de/forum/members/...e1642-c-bv.jpg

Bin nochmal am tüfteln, wenn jmd eine Idee hat, nur her damit

mfg
kanonenfutter ist offline   Mit Zitat antworten