| 導購 | 订阅 | 在线投稿
分享
 
 
 

C語言圖像處理方法

2008-06-01 02:00:53  編輯來源:互聯網  简体版  手機版  移動版  評論  字體: ||

1.圖像平移

圖像平移只是改變圖像在屏幕上的位置,圖像本身並不發生變化。

假設原圖像區域左上角坐標爲(x0, y0),右下角坐標爲(x1, y1),將圖像分別沿x和y軸平移dx和dy,則新圖像的左上角坐標爲(x0 +dx, y0+dy),右下角坐標爲(x1+dx, y1+dy)。坐標平移變換公式爲:

x′ = x + dx

y′ = y + dy

在屏幕上實現圖像的移動分爲四個步驟:

⑴ 保存原圖像到緩沖區。

⑵ 擦除原圖像。

⑶ 計算平移後的新坐標。

⑷ 在新的坐標位置重新顯示原圖像。

其中,擦除原圖像的方法與圖形變換中擦除原圖形的方法一致,在實現中仍采用XOR異或方式畫圖擦除原圖像。對于新坐標值的計算還需要考慮邊界情況,不要在圖像平移後超出答應的屏幕範圍。此外,假如采用C函數getimage()和putimage()來保存和恢複圖像,則圖像的大小不能超過64K。

2.圖像顛倒

圖像顛倒是指把定義好的圖像區域上下翻轉地顯示在屏幕上。分析圖像顛倒的過程,可發現每行的圖像信息都保持不變,而只是改變了行的順序,將第一行與最後的第n行相互交換,第二行與第n-1行交換……,依此類推,從而實現了圖像的顛倒。只需采用按行交換的方式,即可方便地修改緩沖區內容,實現圖像的顛倒。基本步驟如下:

(1) 用getimage()保存原圖像,並擦除原圖像。

(2) 計算圖像的高度,即行數height;計算圖像寬度width;計算保存一行圖像信息

height = bottom - top + 1;

width = right - left + 1;

linebytes = (width + 7) / 8 * 4;

(3)利用行交換緩沖區linebuf在圖像內存緩沖區中進行信息交換,即把第一行與最末行交換,第2行與第n-1行交換……,依此類推,直至全部交換完畢。

(4)把交換後的圖像緩沖區內容重新顯示在屏幕上。

3.圖像鏡像變換

鏡像變換是指將指定區域的圖像左右翻轉地顯示在屏幕。分析鏡像變換過程可以發現:每行圖像信息的處理方式是相同的,而且行順序不發生變化,只是每一行的像素信息按從左到右的順序進行了左右顛倒,從而實現了鏡像變換。因此,采用按行逐點變換的方式實現圖像的鏡像。

首先,對于左上角爲(left, top),右下角爲(right, bottom)矩形區域圖像,給出其中任意點(x0, y0)鏡像變換後的新坐標(x′, y′)的坐標變換公式:

x = right - x0 + left

y′ = y0

根據以上公式,對各個像素點計算新坐標後,直接把它顯示在屏幕的相應位置上。

假如完全逐點地進行交換,處理一個像素點就要讀取一次像素值,從而降低了變換速度。由于像素點是順序存放在各個bit位上,每讀取一個字節就包含了8個像素點的信息,只需設置不同的位屏值bitmask,就可以獲得不同像素點的信息。因此采用按行逐字節變換的方式,每讀一次就進行8個像素點的變換,以提高變換速度。

將一矩形區域的圖像進行鏡像變換的基本步驟如下:

(1) 用getimage()把圖像保存到內存緩沖區,並擦除原圖像。

(2) 計算圖像高度,即行數高度height和寬度width;計算保存一行圖像信息占用的字節數linebytes。計算公式如下:

height = bottom - top + 1;

width = right - left + 1;

linebyte = (width + 7) / 8 *4;

(3) 對圖像進行鏡像。

(4)釋放內存圖像緩沖區。

4.圖像旋轉

圖像旋轉是指把定義的圖像繞某一點以逆時針或順時針方向旋轉一定的角度,通常是指繞圖像的中心以逆時針方向旋轉。

假設圖像的左上角爲(left, top),右下角爲(right, bottom),則圖像上任意點(x0, y0)繞其中心(xcenter,ycenter)逆時針旋轉angle角度後,新的坐標位置(x′, y′)的計算公式爲:

xcenter = (right - left + 1) / 2 + left;

ycenter = (bottom - top + 1) / 2 + top;

x′ = (x0 - xcenter) cosθ - (y0 - ycenter) sinθ + xcenter;

y′ = (x0 - xcenter) sinθ + (y0 - ycenter) cosθ + ycenter;

與圖像的鏡像變換相類似,也采用按行逐點變換的方式實現圖像的旋轉,其步驟如下:

(1) 用getimage()把圖像保存到內存緩沖區,並擦除原圖像。

(2) 計算圖像高度height,寬度width,及保存一行圖像信息占用的字節數linebytes,計算公式與鏡像變換的計算公式相同。

(3) 對圖像逐行進行旋轉變換。

(4) 釋放內存圖像緩沖區。

值得指出的是,這種處理方法不夠。爲此可以采用另一種方法:先在圖像變換緩沖區中處理完畢後,再將變換後的圖像一次顯示在屏幕上。這樣可以取得較好的顯示效果。

C語言圖像處理方法
更多內容請看C/C++進階技術文檔專題,或

  1.圖像平移   圖像平移只是改變圖像在屏幕上的位置,圖像本身並不發生變化。   假設原圖像區域左上角坐標爲(x0, y0),右下角坐標爲(x1, y1),將圖像分別沿x和y軸平移dx和dy,則新圖像的左上角坐標爲(x0 +dx, y0+dy),右下角坐標爲(x1+dx, y1+dy)。坐標平移變換公式爲:   x′ = x + dx   y′ = y + dy   在屏幕上實現圖像的移動分爲四個步驟:   ⑴ 保存原圖像到緩沖區。   ⑵ 擦除原圖像。   ⑶ 計算平移後的新坐標。   ⑷ 在新的坐標位置重新顯示原圖像。   其中,擦除原圖像的方法與圖形變換中擦除原圖形的方法一致,在實現中仍采用XOR異或方式畫圖擦除原圖像。對于新坐標值的計算還需要考慮邊界情況,不要在圖像平移後超出答應的屏幕範圍。此外,假如采用C函數getimage()和putimage()來保存和恢複圖像,則圖像的大小不能超過64K。 2.圖像顛倒   圖像顛倒是指把定義好的圖像區域上下翻轉地顯示在屏幕上。分析圖像顛倒的過程,可發現每行的圖像信息都保持不變,而只是改變了行的順序,將第一行與最後的第n行相互交換,第二行與第n-1行交換……,依此類推,從而實現了圖像的顛倒。只需采用按行交換的方式,即可方便地修改緩沖區內容,實現圖像的顛倒。基本步驟如下:   (1) 用getimage()保存原圖像,並擦除原圖像。   (2) 計算圖像的高度,即行數height;計算圖像寬度width;計算保存一行圖像信息    height = bottom - top + 1;    width = right - left + 1;   linebytes = (width + 7) / 8 * 4;   (3)利用行交換緩沖區linebuf在圖像內存緩沖區中進行信息交換,即把第一行與最末行交換,第2行與第n-1行交換……,依此類推,直至全部交換完畢。   (4)把交換後的圖像緩沖區內容重新顯示在屏幕上。 3.圖像鏡像變換   鏡像變換是指將指定區域的圖像左右翻轉地顯示在屏幕。分析鏡像變換過程可以發現:每行圖像信息的處理方式是相同的,而且行順序不發生變化,只是每一行的像素信息按從左到右的順序進行了左右顛倒,從而實現了鏡像變換。因此,采用按行逐點變換的方式實現圖像的鏡像。   首先,對于左上角爲(left, top),右下角爲(right, bottom)矩形區域圖像,給出其中任意點(x0, y0)鏡像變換後的新坐標(x′, y′)的坐標變換公式:   x = right - x0 + left   y′ = y0   根據以上公式,對各個像素點計算新坐標後,直接把它顯示在屏幕的相應位置上。   假如完全逐點地進行交換,處理一個像素點就要讀取一次像素值,從而降低了變換速度。由于像素點是順序存放在各個bit位上,每讀取一個字節就包含了8個像素點的信息,只需設置不同的位屏值bitmask,就可以獲得不同像素點的信息。因此采用按行逐字節變換的方式,每讀一次就進行8個像素點的變換,以提高變換速度。   將一矩形區域的圖像進行鏡像變換的基本步驟如下:   (1) 用getimage()把圖像保存到內存緩沖區,並擦除原圖像。   (2) 計算圖像高度,即行數高度height和寬度width;計算保存一行圖像信息占用的字節數linebytes。計算公式如下:   height = bottom - top + 1;   width = right - left + 1;   linebyte = (width + 7) / 8 *4;   (3) 對圖像進行鏡像。   (4)釋放內存圖像緩沖區。 4.圖像旋轉   圖像旋轉是指把定義的圖像繞某一點以逆時針或順時針方向旋轉一定的角度,通常是指繞圖像的中心以逆時針方向旋轉。   假設圖像的左上角爲(left, top),右下角爲(right, bottom),則圖像上任意點(x0, y0)繞其中心(xcenter,ycenter)逆時針旋轉angle角度後,新的坐標位置(x′, y′)的計算公式爲: xcenter = (right - left + 1) / 2 + left; ycenter = (bottom - top + 1) / 2 + top; x′ = (x0 - xcenter) cosθ - (y0 - ycenter) sinθ + xcenter; y′ = (x0 - xcenter) sinθ + (y0 - ycenter) cosθ + ycenter;   與圖像的鏡像變換相類似,也采用按行逐點變換的方式實現圖像的旋轉,其步驟如下:   (1) 用getimage()把圖像保存到內存緩沖區,並擦除原圖像。   (2) 計算圖像高度height,寬度width,及保存一行圖像信息占用的字節數linebytes,計算公式與鏡像變換的計算公式相同。   (3) 對圖像逐行進行旋轉變換。   (4) 釋放內存圖像緩沖區。   值得指出的是,這種處理方法不夠。爲此可以采用另一種方法:先在圖像變換緩沖區中處理完畢後,再將變換後的圖像一次顯示在屏幕上。這樣可以取得較好的顯示效果。 [url=/bbs/detail_1785172.html][img]http://image.wangchao.net.cn/it/1323424430305.gif[/img][/url] 更多內容請看C/C++進階技術文檔專題,或
󰈣󰈤
王朝萬家燈火計劃
期待原創作者加盟
 
 
 
>>返回首頁<<
 
 
 
 
 熱帖排行
 
王朝網路微信公眾號
微信掃碼關註本站公眾號 wangchaonetcn
 
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有