2013-07-15 17 views
10

Ich möchte Bildverarbeitung in C++ lernen, aber ich möchte keine Drittanbieter-Bibliothek für die Bildbearbeitung verwenden. Die Verwendung der Bibliothek zur Anzeige der Bilder ist in Ordnung, aber alle Manipulationen müssen manuell durchgeführt werden.C++ Bildbearbeitung Tutorials ohne 3rd-Party-Bibliothek

Bitte zeigen Sie mir ein paar gute Tutorials. Ich bin ein Anfänger in diesem Bereich, also muss ich auch wissen, wie man ein Bild anzeigt.

+0

Sie möchten Bilder manipulieren, ohne eine vorgefertigte Bibliothek zu verwenden? Du hast einen sehr, sehr langen Weg vor dir. Es wird kein Tutorial dafür geben. Sie müssen die JPG-Spezifikation lesen, die Theorie hinter imaginären Manipulationen verstehen (es sei denn, Sie machen einfache Dinge wie das Beschneiden) und diese Manipulationen dann auf das spezifische Format von JPG anwenden. Und dann müssen Sie für PNG, GIF, etc. wiederholen. – Corbin

+0

Wenn Ihr Ziel ist Bild * Verarbeitung * sollten Sie mindestens auch eine Bibliothek verwenden, um Bilder aus verschiedenen Container-Formate wie PNG, JPEG, TIFF, ... zu laden . Diese haben mit der Verarbeitung nichts zu tun. Daneben ist diese Frage natürlich viel zu weit gefasst, benutze Google. – KillianDS

+0

Wenn Ihr Hauptziel ist, digitale Bildverarbeitung zu lernen, empfehle ich Ihnen, Matlab anstelle von C++ zu verwenden. – Korchkidu

Antwort

7

Scheint es fehlt Ihnen grundlegende Kenntnisse der digitalen Bildverarbeitung, empfehle ich Ihnen dieses Buch. Digitale Bildverarbeitung (3rd Edition) Rafael C.Gonzalez/Richard E.Woods http://www.amazon.com/dp/013168728X

für den Basisbetrieb OpenCV mit (was ich vertraut bin mit), hier ein Beispiel:

/* 
function:image reverse 
*/ 
#include "stdafx.h" 
#include <stdlib.h> 
#include <stdio.h> 
#include <math.h> 
#include <cv.h> 
#include <highgui.h> 
int main(int argc, char *argv[]) 
{ 
    IplImage* img = 0; 
    int height,width,step,channels; 
    uchar *data; 
    int i,j,k; 
    if(argc<2) 
    { 
     printf("Usage: main <image-file-name>/n/7"); 
     exit(0); 
    } 
    // Load image 
    img=cvLoadImage(argv[1],-1); 
    if(!img) 
    { 
     printf("Could not load image file: %s\n",argv[1]); 
     exit(0); 
    } 
    // acquire image info 
    height = img->height;  
    width  = img->width;  
    step  = img->widthStep;  
    channels = img->nChannels; 
    data  = (uchar *)img->imageData; 
    printf("Processing a %dx%d image with %d channels/n",height,width,channels); 
    // create display window 
    cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE); 
    cvMoveWindow("mainWin", 100, 100); 
    // reverse image 
    for(i=0;i<height;i++) 
     for(j=0;j<width;j++) 
      for(k=0;k<channels;k++) 
       data[i*step+j*channels+k]=255-data[i*step+j*channels+k]; 
    // display reversed image 
    cvShowImage("mainWin", img); 
    cvWaitKey(0); 
    cvReleaseImage(&img); 
    printf("height=%d width=%d step=%d channels=%d",height,width,step,channels); 
    return 0; 
} 
+0

Ich möchte nicht in Details von JPEG oder anderen Containern gehen. Was ich tun möchte, ist: Laden Sie das Bild (Verwendung von 3rd-Party-Bibliothek wird besser für diese IMO), dann wenden Sie manuelle Änderungen an Pixeldaten (die RGB-Werte), um verschiedene Manipulationen durchzuführen. –

+0

@HarshilSharma Verwenden Sie einfach den grundlegenden Teil der Grafikbibliothek von Drittanbietern, wie OpenCV, CXImage, soweit ich weiß. – lulyon

+0

@HarshilSharma Für "manuelle Änderungen an Pixeldaten", überprüfen Sie bitte die aktualisierte Antwort mit einem OpenCV-Beispiel. – lulyon