1. 程式人生 > >利用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) 釋放記憶體影象緩衝區。   值得指出的是,這種處理方法不夠。為此可以採用另一種方法:先在影象變換緩衝區中處理完畢後,再將變換後的影象一次顯示在螢幕上。這樣可以取得較好的顯示效果。