全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:3126
推到 Plurk!
推到 Facebook!

使用OpenCV Create一個1-bit 單通道的tiff影像檔

答題得分者是:arisaka_matsuri
nat626
一般會員


發表:2
回覆:5
積分:1
註冊:2006-09-19

發送簡訊給我
#1 引用回覆 回覆 發表時間:2009-01-14 19:20:16 IP:118.166.xxx.xxx 訂閱
我想使用IplImage來產生一個1-bit 單通道 非0即1的黑白影像
我的程式碼


[code cpp]
IplImage *image;
CvSize size = cvSize( 320, 240);
char array[320*240];
image = cvCreateImageHeader( size, IPL_DEPTH_1U, 1 );
for(int x = 0 ; x < 320*240 ; x ){
array[ x ] = x%2;
}
cvSetImageData( image, array, image->widthStep );
cvSaceImage( "testImage.tiff", image );


[/code]

但卻得到錯誤訊息
OpenCV ERROR: Input image depth is not supported by function ()
in function cvGetMat, ../../../cxcore/src/cxarray.cpp(2799)
Terminating the application...
called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933)
Terminating the application...
called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933)
Terminating the application...
called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933)
Terminating the application...
called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933)
Terminating the application...
called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933)
Terminating the application...
called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933)
Terminating the application...
called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933)
Terminating the application...
called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933)
Terminating the application...
called from cvUnregisterType, ../../../cxcore/src/cxpersistence.cpp(4933)
Terminating the application...

但我把image = cvCreateImageHeader( size, IPL_DEPTH_1U, 1 );

改成image = cvCreateImageHeader( size, IPL_DEPTH_8U, 1 );

就正常了 :( 但這樣子就是 8-bit 不是我想要的 1-bit

爬文爬一天 找不到問題 請幫助我吧~~~THX
------
編輯記錄
nat626 重新編輯於 2009-01-14 19:20:55, 註解 無‧
nat626 重新編輯於 2009-01-15 09:51:48, 註解 無‧
nat626 重新編輯於 2009-01-15 09:52:12, 註解 無‧
nat626 重新編輯於 2009-01-15 09:52:41, 註解 無‧
nat626 重新編輯於 2009-01-15 09:53:07, 註解 無‧
nat626 重新編輯於 2009-01-15 09:53:31, 註解 無‧
nat626 重新編輯於 2009-01-15 09:54:00, 註解 無‧
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#2 引用回覆 回覆 發表時間:2009-01-14 23:24:56 IP:140.113.xxx.xxx 訂閱
你好

就我所知,OpenCV雖然有IPL_DEPTH_1U的定義
但是沒有任何函式支援這樣的資料型態!
請參考OpenCV的說明文件
其中也有提到IplImage影像支援的格式
並沒有包含IPL_DEPTH_1U
nat626
一般會員


發表:2
回覆:5
積分:1
註冊:2006-09-19

發送簡訊給我
#3 引用回覆 回覆 發表時間:2009-01-15 10:03:09 IP:118.166.xxx.xxx 訂閱

===================引 用 arisaka_matsuri 文 章===================
你好

就我所知,OpenCV雖然有IPL_DEPTH_1U的定義
但是沒有任何函式支援這樣的資料型態!
請參考OpenCV的說明文件
其中也有提到IplImage影像支援的格式
並沒有包含IPL_DEPTH_1U



謝謝大大回應 : )

剛剛看了OpenCV的說明文件

pixel depth in bits : IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F, and IPL_DEPTH_64F are supported

那...有別的辦法可以產生出1-bit 單通道的影像檔嗎?

麻煩大大指點一下
------
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#4 引用回覆 回覆 發表時間:2009-01-15 13:29:46 IP:140.113.xxx.xxx 訂閱
你好,
不知道你的應用是在哪方面?
我看了另一個image library,DevIL,也沒支援1-bit影像

如果沒有特殊的應用(節省記憶體、專門的演算法開發等)
其實沒必要用1-bit的方式表示0與1的黑白影像
雖然資料看起來精簡,但一般以像素為單位的影像操作反而不好處理
反之,真的要做也是有辦法的
常見的方式是把8個bit組成一個byte來存放
可以用bit field來實現
e.g.
[code cpp]
struct PackedPixels
{
unsigned char pixel0 : 1;
unsigned char pixel1 : 1;
unsigned char pixel2 : 1;
unsigned char pixel3 : 1;
unsigned char pixel4 : 1;
unsigned char pixel5 : 1;
unsigned char pixel6 : 1;
unsigned char pixel7 : 1;
};

PackedPixels pixels;
pixels.pixel0 = 0;
pixels.pixel1 = 1;
pixels.pixel2 = 0;
...
[/code]
這樣就可以單獨存取每一個bit(pixel)
若是需要搭配OpenCV
可以將上述的PackedPixels看成一個byte
就可以用IPL_DEPTH_8U的資料格式存放
nat626
一般會員


發表:2
回覆:5
積分:1
註冊:2006-09-19

發送簡訊給我
#5 引用回覆 回覆 發表時間:2009-01-15 14:38:54 IP:118.166.xxx.xxx 訂閱
萬分感謝大大回應 : )

我主要的應用只是儲存影像而已

所以並不會對影像做操作

由於是大量的儲存影像

所以用 8-bit 來存,空間會吃很兇

像 320*240 1-bit 的 imageSize 是9600

8-bit 的 imageSize 是 79800

差了 8 倍 O_Q

另外剛剛發現

[code cpp]
IplImage *image;
CvSize size = cvSize( 320, 240);
char array[320*240];
image = cvCreateImageHeader( size, IPL_DEPTH_1U, 1 );
for(int x = 0 ; x < 320*240 ; x ){
array[ x ] = x%2;
}
cvSetImageData( image, array, image->widthStep );
cvSaceImage( "testImage.tiff", image );
[/code]

他是掛在 cvSaceImage( "testImage.tiff", image );

我一開始以為是掛在image = cvCreateImageHeader( size, IPL_DEPTH_1U, 1 );

很懊惱...O_Q
------
arisaka_matsuri
高階會員


發表:25
回覆:205
積分:231
註冊:2003-10-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2009-01-15 15:01:05 IP:140.113.xxx.xxx 訂閱
你好,
不用懊惱,會掛點是正常的
因為cvSaveImage()的說明有提到:
Only 8-bit single-channel or 3-channel (with 'BGR' channel order) images can be saved using this function.
所以,就算能產生色彩深度為1-bit的影像
也沒辦法用 cvSaveImage() 儲存

剛剛找到一個library可以處理1-bit的tiff
The Free Image Project
http://freeimage.sourceforge.net/
可以參考看看
nat626
一般會員


發表:2
回覆:5
積分:1
註冊:2006-09-19

發送簡訊給我
#7 引用回覆 回覆 發表時間:2009-01-15 16:35:10 IP:118.166.xxx.xxx 訂閱

===================引 用 arisaka_matsuri 文 章===================
你好,
不用懊惱,會掛點是正常的
因為cvSaveImage()的說明有提到:
Only 8-bit single-channel or 3-channel (with 'BGR' channel order) images can be saved using this function.
所以,就算能產生色彩深度為1-bit的影像
也沒辦法用 cvSaveImage() 儲存

剛剛找到一個library可以處理1-bit的tiff
The Free Image Project
http://freeimage.sourceforge.net/
可以參考看看




謝謝大大的指點!!
我現在正在全力研究Free Image
如果有問題我在上來提問 : ))
在次謝謝 : )))
------
系統時間:2018-02-24 0:34:31
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!