Dev-C++ 影像縮小

我想請問一下 如何使用Dev-C++語言 在不使用 內建函式、現有之副程式 的情況下將圖片 512*512 縮小成 256*256

其程式碼為??

Update:

不限定程式 matlab 或 者 dev-c++ 甚至其他 也行

將圖片進行縮小 的程式碼

Update 2:

老實說...我還是看不懂...非常抱歉...

5 Answers

Rating
  • Tai
    Lv 5
    7 years ago
    Favorite Answer

    Down sample 自己寫還好,

    你先看看教科書或教授的講義,

    一定會強調, 為了避免 anti-aliasing, 用兩步驟實現

    1) blur 2) down sample,

    1) Blur 通常用 Gaussian blur

    http://blog.csdn.net/hhygcy/article/details/4

    2) 而 down sample, 這種 512 到 256,

    只要 i[y][x] = I[y*2][x*2] 這麼簡單就可以了

    至於讀 image format, 是另外一個議題吧?

    2014-03-07 00:52:17 補充:

    至於讀檔問題, 如果沒有指定哪種圖檔格式,

    自己用 opencv 產生 raw data 啊

    不同檔案格式的難度差別很大,

    寫 raw data, 沒有壓縮的 bmp, 到 JPEG,

    複雜度差異很多, 對學生也不公平

    我不相信你們老師沒有要求是哪種格式就這麼出題

    這貌似只是考驗他講義內的 down sampling 作業

    2014-03-07 01:31:27 補充:

    教授回: down sampling 不能呼叫內建函式,要自行寫 down sampling 程式,

    請再重新繳交。

    看似教授只說 down sampling 要自己寫, 其他部分沒有特別要求,

    版主就勇敢自己寫吧

    2014-03-07 02:47:34 補充:

    #include <stdio.h>

    #include <string.h> //memcpy

    #include <opencv2/core/core.hpp>

    #include <opencv2/highgui/highgui.hpp>

    using namespace cv;

    struct BGR {unsigned char b,g,r;};

    struct IMG {

    BGR**m; int w, h;

    IMG(int w, int h, Mat* _m=0):m(0) {

    m = new BGR*[h];

    for (int y=0; y<h; ++y) {

    m[y] = new BGR[w];

    if (_m) memcpy(m[y], _m->ptr(y), _m->step[0]);

    }

    }

    ~IMG() {

    for (int y = 0; y < h; ++y) delete [] m[y];

    delete [] m;

    }

    BGR* operator[](int y){ return m[y];}

    };

    int main()

    {

    char FileName[10] = "512.png";

    Mat m1 = imread(FileName);

    Mat m2(256, 256, CV_8UC3);

    IMG i1(512,512,&m1), t(512,512), i2(256,256);

    //.................................................

    // 1) blur i1 by 3x3 Gaussian filter;

    double gau[3][3] = {

    {1./16., 2./16., 1./16.},

    {2./16., 4./16., 2./16.},

    {1./16., 2./16., 1./16.},

    };

    for (int y=0; y<512; ++y)

    for (int x=0; x<512; ++x) {

    double b,g,r,w; b=g=r=w=0.;

    for (int dy=-1,gy=0; dy<1; ++dy,++gy)

    for (int dx=-1,gx=0; dx<1; ++dx,++gx) {

    if (y+dy<0||x+dx<0||y+dy>=512||x+dx>=512) continue;

    double gw = gau[gy][gx];

    b+=i1[y+dy][x+dx].b * gw;

    g+=i1[y+dy][x+dx].g * gw;

    r+=i1[y+dy][x+dx].r * gw;

    w+=gw;

    }

    t[y][x].b = unsigned(b/w);

    t[y][x].g = unsigned(g/w);

    t[y][x].r = unsigned(r/w);

    }

    // 2) i2 = down sample i1

    for (int y=0; y<256; ++y) {

    for (int x=0; x<256; ++x)

    i2[y][x]=t[y*2][x*2];

    }

    //.................................................

    for (int y=0;y<256; ++y)

    memcpy((void*)m2.ptr(y), i2[y], 256*3);

    imshow("512", m1);

    imshow("256", m2);

    waitKey(0);

    return 0;

    }

    2014-03-07 02:51:14 補充:

    看看老師會不會接受吧

    縮小的部分是完全沒用到其他 library 喔.

    手寫 Gaussian filter 和 down sample

    2014-03-07 20:23:56 補充:

    Chen 前輩能自己 decode/encode JPEG, 完全不用 library,

    連 DCT, Zig-zag, Huffman coding 都自己寫, 真的很神

    在此一拜 ...

    2014-03-08 11:01:05 補充:

    It's hard enough :)

    2014-03-10 15:13:44 補充:

    你嘗試了嗎? 我也想知道老師是只要縮小, 還是要自己解析檔案格式?

    2014-03-11 02:00:34 補充:

    學期中了喔, 加油加油

  • 卸貨
    Lv 5
    7 years ago

    可能老師要他們從底層開始自己建置所有工具,比方說從硬體驅動開始……

    2014-03-05 23:36:46 補充:

    你是說從驅動程式開始嗎?這我不會,這太難了!

    2014-03-08 12:39:27 補充:

    只是重新取樣縮小的話是很簡單的,就像 Tai 說的只要 只要 i[y][x] = I[y*2][x*2] 這麼簡單就可以了。我猜真正的難題是在解析檔案格式的部份,你若不是會錯老師的意思,就是你們惹毛老師了!

  • Chen
    Lv 6
    7 years ago

    Color processing is basic function for image processing.

    1. jpg file is converted into bmp file or Bmp file is converted into jpg file.

    2. 24bit colors file is converted into 16 bit colors file

    3 24bit colors file is converted into 12 bit colors file

    4. 24bit colors file is converted into 8 bit colors file

    5. 24bit colors file is converted into 8 bit grey level file ( often using )

    6. 24bit colors file is converted into 4 bit grey level file

    7. 24bit colors file is converted into binary white & black file ( often using )

    for example

    1. original file lena512.jpg

    圖片參考:https://s.yimg.com/rk/AC08187637/o/1706704487.jpg

    processing after my program( c/c++) without any graphic library

    圖片參考:https://s.yimg.com/rk/AC08187637/o/1143515672.jpg

    2. processing after my program( jpg8gray)

    圖片參考:https://s.yimg.com/rk/AC08187637/o/403223412.jpg

    3. processing after my program( jpg2bin)

    圖片參考:https://s.yimg.com/rk/AC08187637/o/2049823358.jpg

    2014-03-05 19:47:51 補充:

    在不使用內建函式/現有之副程式 means coding program(subrountine) in person.

    2014-03-05 20:57:43 補充:

    coding subroutine stretch_jpeg( argv[1], argv[2], width, height, bright, contrast, quality)

    argv[1] is input file, argv[2] is output file, width, height of output file

    2014-03-06 00:54:04 補充:

    coding program can't use any graphic library ( OPENCV, opengl, windows ....et)

    2014-03-06 00:57:38 補充:

    You must decode *.bmp or *.jpg format , loading it into your memory and processing it whithout any graphic library( such as opencv, openGL, windows, direct X ...etc)

    2014-03-06 01:04:50 補充:

    You must pay attention to allocated memory must be 4 multiple boundary.

    2014-03-08 10:33:45 補充:

    Tain, Thank you, I only encode and decode JPEG and BMP format, I can't good at others format.

    2014-03-08 11:28:08 補充:

    attention:data of BMP format is from down up to top approach, JPEG

    format is from top to down approach. so processing data must do inverse

    of data of BMP format.

  • 7 years ago

    我們教授 是這樣說明的 老實說 我也不知道該怎麼做這份作業 基本上大多數都是使用內建來完成 要求我們不使用 太難了吧= = ?

    2014-03-05 23:17:27 補充:

    樓上的大大 請問會寫嗎 ? 老實說 我真的不會

    2014-03-06 00:00:06 補充:

    這是我打的程式碼

    http://www.fotopu.com/image/543453

    教授回: down sampling 不能呼叫內建函式,要自行寫 down sampling 程式,

    請再重新繳交。

    我不懂阿= =

    2014-03-07 07:58:29 補充:

    瞭解了 謝謝您 我先試試看

    2014-03-10 16:30:30 補充:

    要自己宣告變數 就跟您上面的程式很相像 設定高度 寬度 長度 如何載入那些

    光看影像處理的課本 只是載入的程式碼就好長一篇... 我程式碼並不強,所以我覺得很難阿 !!!

  • How do you think about the answers? You can sign in to vote the answer.
  • 7 years ago

    不能使用內建函式, 任何副程式,

    你要怎麼讀檔??

    2014-03-05 20:22:31 補充:

    不是難不難的問題,

    連最基本的內建函式fopen都不許用,

    還有現有之副程式如windows提供的或是IDE提供的也不能用.

    你還有什麼選擇?

    matlab不能用內建函式,

    那怎不叫你們叫獸不能用嘴巴吃飯.

Still have questions? Get your answers by asking now.