画像の回転:C言語で自作

2015-02-09 :  PCクリニック
本文の前に、
-・・・ -・-
現時点での blogramのランクインカテゴリは、
5、2、0、1、0、 0、1、0、0、0(41)で、換算ポイント 71pt 。
3日前に「Firefox」が7位にアップ、「グルコサミン」がbg値アップ。
以降、今朝方まで「C言語」を含め殆どでbg値が変わらず。
・-・ - -・

さて、本文。


先日(2015-02-03)の記事:
画像の回転:方法の調査
の後、
こんなサイトを見つけた。
C言語による画像回転処理について
最終更新:2001/02/06 と些か古いが、・・・・・
  ここでは、私、酒井理雄(TSUGU)が卒業研究において作成したDIB画像の
  回転処理プログラムのアルゴリズムについて解説をしたいと思います。
  ・・・・・
  ・・・・・
とかある。


それで、<紙>も、自作してみた。

作るのは、“C言語”で「C_Sub_Rotate.dll」の中の 'Rotate' 関数。


先に、呼び出す“Python”メインについて、・・・・・

# -*- coding: utf-8 -*-
import ctypes
import numpy as np
from PIL import Image

img = Image.open( 'hogehoge.tif' ) # 扱うのは、8bit TIFF
xx, yy = img.size
p=max(xx,yy); XX=xx+2*p; YY=yy+2*p
bkg = np.zeros( ( YY, XX ), np.uint8 ) # background
bkg[p:yy+p, p:xx+p] = img # 埋込(端処理手抜き用)

k_lib = ctypes.CDLL( 'C_Sub_Rotate.dll' ) # dll 読み込み

GT = np.arange( 1, dtype=ctypes.c_ubyte ) # <===== 元画像
GT = bkg # <===== ~~~~~~

gT = np.zeros( ( yy, xx ), dtype=ctypes.c_ubyte ) # <===== 結果画像

k = 30 # 反時計回りに 30 度回転

sk = ctypes.c_double( np.sin(np.pi*k/180) ) # sin 、
ck = ctypes.c_double( np.cos(np.pi*k/180) ) # cos を計算して渡す。
##############
k_lib.Rotate( XX, YY, xx, yy, sk, ck,
GT.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte)),
gT.ctypes.data_as(ctypes.POINTER(ctypes.c_ubyte)) )
##############
Image.fromarray( gT ).save( 'Rotated.tif' ) # 結果画像出力



それで、作ったのは「TSUGU」さんの“線形補間”を掛けた処までのもの。

宣言 ( #include ) 文は省略
( 'Byte' とは、<紙>定義:'unsigned char' の事 )

int bilin( double dx, double dy, int v00, int v01, int v10, int v11 ){
return( (1-dy)*((1-dx)*v00 + dx*v01) + dy*((1-dx)*v10 + dx*v11) );
}
// ------------------------------------------------------------------ Main
// ( inp size ) ( out size ) ( sin(k), cos(k) ) ( inp / out image )
int Rotate( int XX, int YY, int xx, int yy, double sk, double ck, Byte* GT, Byte* gT ){
// 画像中心で回転
// 画像回転処理メインルーチン : 出力画像の座標でループ
n = -1;
for( y=0; y<yy; y++ ){
for( x=0; x<xx; x++ ){
// 出力画像座標(x,y)から入力画像の座標(X,Y)を計算
dx = ck*(x-(xx/2)) - sk*(y-(yy/2)) + XX/2;
X=dx; dx=dx-X;
dy = sk*(x-(xx/2)) + ck*(y-(yy/2)) + YY/2;
Y=dy; dy=dy-Y;

// X, Yはともに入力画像の有効範囲にある & バイリニア補間
n++; m = Y*XX+X;
gT[n] = bilin( dx, dy, GT[m], GT[m+1], GT[m+XX], GT[m+1+XX] );
}
}
return( 0 );
}


これを、
Clang(+MinGW)でCソースをコンパイル(&リンク)
で書いた「DnD_c2dll.py」に、
ドラッグ&ドロップして「.dll」作成。

これで、良さそう???


本日はここまで。


見ていただいた序でとは厚かましい限りですが、
お帰りに投票して頂けるとなお嬉しいです。 ⇒ blogram投票ボタン


141227F
関連記事
スポンサーサイト

コメントの投稿

管理者にだけ表示を許可する

おきてがみ/blogram
blogram投票ボタン



おきてがみ

最新記事
カレンダー
09 | 2017/10 | 11
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31 - - - -
月別アーカイブ
カテゴリ
最新コメント
検索フォーム
リンク
プロフィール

<紙>

Author:<紙>
ようこそ。
「パソコンヲタクの雑記帳」
もろもろなことを綴っています。
パソコン ヲタクってねくら?
画像は kami でなく kani です。

カウンター(fc2、i2i) /Google Analytics


i2i(from 2010-08-24)
Total =
Today  =  
Yesterday=
アンチエイジング

Google Analytics
ブックマーク