2014-02-04 2 views
1

Я попытался выполнить гауссовское размытие с использованием C++ (OpenCV). Это кодgaussian blur C++ (can not show full image)

int mask [3][3] = {1 ,2 ,1 , 
       2 ,3 ,2 , 
       1 ,2 ,1 }; 

int getPixel (unsigned char * arr , int col , int row) { 
    int sum = 0; 
    for (int j = -1; j <=1; j ++) { 
    for (int i = -1; i <=1; i ++) { 
     int color = arr [(row + j) * width + (col + i) ]; 
     sum += color * mask [ i +1][ j +1]; 
    } 
    } 
    return sum /15; 
} 

void h_blur (unsigned char * arr , unsigned char * result) { 
    int offset = 2 *width ; 
    for (int row =2; row < height -3; row ++) { 
    for (int col =2; col < width -3; col ++) { 
     result [ offset + col ] = getPixel (arr , col , row) ; 
    } 
    offset += width ; 
    } 
} 

int main(int argc, char** argv) 
{ 
starttime = getTickCount(); 
    image_input = cvLoadImage("test.jpg", CV_LOAD_IMAGE_UNCHANGED); 

width  = image_input->width; 
height = image_input->height; 
widthStep = image_input->widthStep; 
channels = image_input->nChannels; 

IplImage* image_output = cvCreateImage(cvGetSize(image_input),IPL_DEPTH_8U,channels); 
unsigned char *h_out = (unsigned char*)image_output->imageData; 
unsigned char *h_in = (unsigned char*)image_input->imageData; 

//sobel_parallel(h_in, h_out, width, height, widthStep, channels); 
h_blur (h_in , h_out) ; 

endtime = getTickCount(); 
printf("Waktu Eksekusi = %f\n", (endtime-starttime)/getTickFrequency()); 
cvShowImage("CPU", image_output); 
cvSaveImage("output.jpg",image_output); 
cvReleaseImage(&image_output); 
waitKey(0); 
} 

, но когда я запускаю программу, образ разделены на три части. Я все еще не нашел, что не так с моим кодом. T_T

здесь результата are divided into three

пожалуйста, помогите мне решить эту проблему.

ответ

3
#include <opencv2/opencv.hpp> 

int mask [3][3] = {1 ,2 ,1 , 
       2 ,3 ,2 , 
       1 ,2 ,1 }; 

int width; 
int height; 
int widthStep; 
int channels; 

int getPixel (unsigned char * arr , int col , int row , int k) { 
    int sum = 0; 
    int denom = 0; 
    for (int j = -1; j <=1; j ++) { 
    for (int i = -1; i <=1; i ++) { 
     if ((row + j) >= 0 && (row + j) < height && (col + i) >= 0 && (col + i) < width) { 
     int color = arr [(row + j) * 3 * width + (col + i) * 3 + k]; 
     sum += color * mask [ i +1][ j +1]; 
     denom += mask [ i +1][ j +1]; 
     } 
    } 
    } 
    return sum/denom; 
} 

void h_blur (unsigned char * arr , unsigned char * result) { 
    for (int row =0; row < height; row ++) { 
    for (int col =0; col < width; col ++) { 
     for (int k = 0; k < 3; k++) { 
      result [ 3 * row * width + 3 * col + k] = getPixel (arr , col , row , k) ; 
     } 
    } 
    } 
} 

int main(int argc, char** argv) 
{ 
    //starttime = getTickCount(); 
    IplImage *image_input = cvLoadImage("test.jpg", CV_LOAD_IMAGE_UNCHANGED); 

    width  = image_input->width; 
    height = image_input->height; 
    widthStep = image_input->widthStep; 
    channels = image_input->nChannels; 

    IplImage* image_output = cvCreateImage(cvGetSize(image_input),IPL_DEPTH_8U,channels); 
    unsigned char *h_out = (unsigned char*)image_output->imageData; 
    unsigned char *h_in = (unsigned char*)image_input->imageData; 

    //sobel_parallel(h_in, h_out, width, height, widthStep, channels); 
    h_blur (h_in , h_out) ; 

    //endtime = getTickCount(); 
    //printf("Waktu Eksekusi = %f\n", (endtime-starttime)/getTickFrequency()); 
    cvShowImage("input", image_input); 
    cvShowImage("CPU", image_output); 
    cvSaveImage("output.jpg",image_output); 
    cvReleaseImage(&image_output); 
    cv::waitKey(0); 
} 

У меня было несколько незначительных проблем при компиляции кода, так что есть несколько дополнительных изменений (кажется, в верхней части кода, возможно, были отрезаны, поэтому несколько объявлений переменных отсутствуют).

В любом случае, большие изменения в getPixel и h_blur.

Основная проблема в вашем коде заключалась в том, что вы не справлялись с тем, что данные содержат три байта (синий, зеленый, красный) для каждого пикселя, а не один байт. Из-за этого ваш код только на самом деле посмотрел на первую треть изображения, и он немного изменил цвета.

+0

О, мой бог, вы правы, это о канале (3 байта данных), который я определил в программе. Очень важно :)) SOLVED !! – bagusbekam