2013-07-15 13 views
10

Chcę nauczyć się przetwarzania obrazu w C++, ale nie chcę używać żadnej biblioteki innej firmy do manipulowania obrazem. Używanie biblioteki do wyświetlania obrazów jest w porządku, ale wszystkie manipulacje należy wykonywać ręcznie.Samouczki przetwarzania obrazów C++ z użyciem biblioteki stron trzecich

Proszę wskazać mi kilka dobrych samouczków. Jestem początkującym w tej dziedzinie, więc muszę również wiedzieć, jak wyświetlić obraz.

+0

Chcesz manipulować obrazami bez używania gotowej biblioteki? Masz przed sobą bardzo, bardzo długą drogę. Nie będzie tego samouczka. Będziesz musiał przeczytać specyfikację JPG, zrozumieć teorię manipulowania wyobrażeniami (chyba że robisz proste rzeczy, takie jak kadrowanie), a następnie zastosować te manipulacje do określonego formatu JPG. A potem będziesz musiał powtórzyć dla PNG, GIF, itd. – Corbin

+0

Jeśli twoim celem jest przetwarzanie obrazu * powinieneś przynajmniej użyć biblioteki do załadowania obrazów z różnych formatów kontenerów, takich jak png, jpeg, tiff, ... . Same w sobie nie mają nic wspólnego z przetwarzaniem. Poza tym to pytanie jest oczywiście zbyt szerokie, użyj google. – KillianDS

+0

Jeśli twoim głównym celem jest nauka cyfrowego przetwarzania obrazu, sugeruję, aby zacząć od używania Matlaba zamiast C++. – Korchkidu

Odpowiedz

7

Wydaje się, że brakuje Ci podstawowej wiedzy na temat przetwarzania cyfrowego obrazu, polecam Ci tę książkę. cyfrowego przetwarzania obrazu (3rd Edition) Rafael C.Gonzalez/Richard E.Woods http://www.amazon.com/dp/013168728X

Do podstawowych operacji za pomocą OpenCV (które znam), oto przykład:

/* 
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

Nie chcę zagłębiać się w szczegóły JPEG lub innych pojemników. Co chcę zrobić, to: załadować obraz (korzystanie z biblioteki innej firmy będzie lepsze dla tego IMO), a następnie zastosować ręczne modyfikacje danych pikseli (wartości RGB) w celu wykonania różnych manipulacji. –

+0

@HarshilSharma Korzystaj z podstawowej części zewnętrznej biblioteki graficznej, takiej jak OpenCV, CXImage, o ile wiem. – lulyon

+0

@HarshilSharma W przypadku "ręcznych modyfikacji danych pikseli", sprawdź zaktualizowaną odpowiedź za pomocą jednego przykładu OpenCV. – lulyon

Powiązane problemy