Pythonでいろいろやってみる

Pythonを使った画像処理や機械学習などの簡単なプログラムを載せています。

OpenCV

国旗判定器を作る

国旗の判別器を作ります。あらかじめいくつかの国旗画像についてBGR各チャンネルの輝度の比率を求めたデータ(判定用リスト)を作成しておいて、それと比較することでどこの国旗かを判別します。 判定用リストのBGR比率(添え字c)と判定したい画像のBGR比率(添…

鳥取砂丘に地上絵を描く

鳥取砂丘の空撮画像に猫の地上絵を書きます。猫のイラストからエッジ検出し、エッジをぼかして地上絵の画像を作成、鳥取砂丘の画像と合成します。 使った関数・メソッド cv2.imread() : 画像ファイルの読み出し cv2.Canny() : Canny法によるエッジ検出 cv2.c…

航空写真を加工し地形に穴が開いているように見せる

画像に穴が開いているような加工をします。単純に黒い円を重ねるだけだと自然に見えないので 白地に灰色塗りつぶした円を作成し255で規格化し画像に積算する 円の大きさを少し小さくして同様に積算する これを繰り返す という手順により中心部に行くほど黒く…

画像の一部分を拡大する

画像の一部分を拡大します。画像を縦に3つに分割し、真ん中を縦に1.5倍に拡大し、3つの画像を一つに連結することで画像の一部を拡大します。 使った関数・メソッド cv2.imread() : 画像ファイルの読み出し cv2.resize() : 画像サイズの変更 cv2.imwrite() : …

画像を点描画に変換する

画像を点描画に変換します。飛び飛びに円を描いて点描化します。円の色を設定するために、元画像の縮小画像を作りその配列から元画像の飛び飛びの色を取得します。 使った関数・メソッド cv2.imread() : 画像ファイルの読み出し ndarray.shape() : ndarrayの…

画像の彩度、明度を変える

Pythonの画像処理ライブラリOpenCVで読み込んだ画像をBGR色空間からHSV色空間に変換することで彩度(Saturation)、明度(Value)の調整が可能になります。この方法で画像の鮮やかさ、明るさを調整します。

フォルダ内の画像の幅をそろえる

フォルダ内にある全ての画像ファイルの幅を同じにします。 使った関数・メソッド os.listdir() : ディレクトリ内のファイルをリストに cv2.imread() : 画像ファイルの読み出し img.shape : 画像の高さ、幅、チャンネル数の取得 cv2.resize() : 画像サイズの…

画像の上下のみぼかす

写真の上下をぼかし、中央はそのまままにします。画像の上中下3つに分け、上下の画像をぼかし、最後に上中下を再度連結します。 使った関数・メソッド cv2.imread() : 画像ファイルの読み出し cv2.blur() : 画像の平均化 cv2.vconcat() : 画像を縦に連結 cv2…

画像をチャンネル別(青、緑、赤)に表示する

カラー画像を青、緑、赤各チャンネルの輝度に分けて表示します。 元画像と各チャンネルの画像を連結して一枚の画像にして保存します。 関連記事 航空写真の画素B(青)G(緑)R(赤)平均値を求め棒グラフにする 画像のヒストグラムを比較する 使った関数・メソッ…

コラージュ写真を作る

写真から人物を切り抜いて、別の写真に貼り付けます。 人物写真から、人物が白(1)・それ以外が黒(0)のマスク、人物が黒(0)・それ以外が白(1)のマスクを生成しそれぞれを人物、背景と要素のかけ合わせを行い 、2つの画像を足し合わせることでコラージュ画像を…

画像に集中線を引く

集中線はマンガで用いられる技法で、画面のある点から外側に放射状に線を引き、動きなどを表現するものです。 画像の内側と外側に円を仮定して、内側の円と外側の円の間で三角形を描画することで、画像に集中線を作成しています。 また、集中線の太さ(三角形…

AKAZE特徴量による画像マッチング

2つの画像から特徴が一致する部分を見つけます。Pythonの画像処理ライブラリOpenCVのAKAZE(Accelerated KAZE)特徴量検出により2つの画像に含まれる一致する文字を検出します

ビンゴカードを作る

ビンゴカードを作ります。リストからランダムに値を取り出す関数random.sampleを用いて、1~70までの数字の入ったリストから25個の数字をランダムに取り出し、それを5X5のマスに表示し、ビンゴカードを作ります。 こちらの記事の内容を使っています。 画像…

画像のモザイク処理

画像をモザイク処理します。画像を縮小してから元のサイズに拡大することでモザイク状になる仕組みです。拡大コピーでギザギザになるのと同じです。ポイントは拡大時の 補完方法にNearest neighbor(最近傍法)を指定することです。Nearest neighborは拡大画像…

画像にグリッド線を引く

画像に格子状の線を引きます。ndarrayのスライシングはstep(いくつおきの要素を指定するか)を設定できるのでfor文を使わずに飛び飛びの要素を指定できます。例えば img[20:150:40, :, :] = 255とすると、y=20から40ピクセルおきにy=150の手前まで(140まで)、…

月の写真から欠けの程度を定量化する

満月や三日月など満ち欠けの異なる月の写真をopencvで輪郭検出し明るい部分の面積を求めるとともに、外接円の面積を求め、その比から月のかけ具合を定量化します。 やること 月の写真を読み出し二値化、領域検出し月の面積を求める 検出した領域に対する外接…

航空写真の画素B(青)G(緑)R(赤)平均値を求め棒グラフにする

市街地、森林、海などの航空写真に対して画像っ全体のB(青)G(緑)R(赤)の平均値を求めどのような傾向にあるか調べます。 やること 航空写真を4枚読み出し、各写真の画素B(青)G(緑)R(赤)平均値を求める 求めた結果を棒グラフにする 使った関数 cv2.imread : 画…

画像を比較して異なる部分を表示する(間違い探し)

2つの画像のすべての画素について、画素が一致するかどうかをPythonの数値計算ライブラリNumpyのwhereにより調べ画素が異なる部分のみを抽出します。

テンプレートマッチングで類似画像を探す

OpenCVの物体検出手段の一つ、テンプレートマッチングを行います。画像とそこから一部切り出したテンプレート画像を用意します。元画像の中でテンプレート画像と一致する場所を検出します。 関連記事 画像のヒストグラムを比較し類似度を求める AKAZE特徴量…

写真から顔検出をする(人間、猫)

写真から人間と猫の顔検出をします。OpenCVにはあらかじめいくつかのHaar特徴ベースCascade型分類器による機械学習データ(検出器)が付属しており、その学習データとオブジェクト検出関数を用いることで、顔検出が簡単に実現できます。 やること ファイル名を…

画像のヒストグラムを比較し類似度を求める

Pythonの画像処理ライブラリOpenCVには画素値(輝度)と画素数のヒストグラムを求めるcalcHist関数があります。またcompareHist関数を使うとヒストグラムの類似度が求められます。2つの画像のチャンネル別のヒストグラムを表示し、ヒストグラム類似度を求めま…

画像の輝度をヒストグラム表示する

やること ファイル名を指定して画像ファイルを読み出す 画像の全画素のB(青)G(緑)R(赤)の輝度をヒストグラム化する 使った関数 cv2.imread : 画像ファイルの読み出し cv2.calcHist : 配列のヒストグラム計算 matplotlib.pyplot.plot : グラフを作成 matplotl…

画像を合成する

やること ファイル名を指定して2つの画像ファイルを読み出す 画像を合成し別ウィンドウで表示する キー入力で表示用ウィンドウを破棄し終了 使った関数 cv2.imread : 画像ファイルの読み出し cv2.addWeighted : 配列の加重合計を求める cv2.imshow : 画像を…

画像をセピア調にする

カラー画像をセピア調にします。セピア調に変換するにはいくつかアルゴリズムがあるようですが、ここでは赤(R)を強調し、青(B)を弱くすることでセピア調に変換します。 関連記事 画像をセピア色に変換する(グレースケール画像を赤く補正する) やること ファ…

画像の色味を変える

カラー画像からB(青)、G(緑)、R(赤)の輝度を個別に0にした画像を作ります。OpenCVで読み込んだカラー画像は 高さX幅X色(BGR) の3次元からなるndarrayに収められるので、[高さ全範囲、幅全範囲、色・青]=0のようにすることで決まった色を抜くことができます。…

円の数を数える

Pythonの画像処理ライブラリOpenCVの領域検出機能を使って画像に含まれる円の数を数えます。findContoursにより領域を検出し、検出した領域の個数から円の数を求めます。

ランダムな位置に複数の円を描画する

やること 横600px縦400pxの黒1色の画像を生成する 黒画像の上に中心がx,y半径が10の水色の塗りつぶした円を描画。xは10~590の範囲のいずれか、yは0~390の範囲のいずれか。 円を10個描画 別ウィンドウで画像を表示 画像をファイルに保存 キー入力で表示用ウ…

円を描画する

やること 横600px縦400pxの白1色の画像を生成する 白1色の画像にX20,Y10を左上、X300,Y100を中心、半径100の円を太さ3pxの青い線を描画し別ウィンドウで表示 キー入力で表示用ウィンドウを破棄し終了 使った関数 np.ones : 要素の値が1の新規配列の生成 cv2.…

長方形を描画する

やること 横600px縦400pxの白1色の画像を生成する 白1色の画像にX20,Y10を左上、X590,Y390を右下の角になる長方形を太さ3pxの青い線を描画し別ウィンドウで表示 キー入力で表示用ウィンドウを破棄し終了 使った関数 np.ones : 要素の値が1の新規配列の生成 c…

直線を引く

やること 横600px縦400pxの白1色の画像を生成する 白1色の画像にX20,Y10からX590,Y390まで太さ3pxの青い線を引き別ウィンドウで表示 キー入力で表示用ウィンドウを破棄し終了 使った関数 np.ones : 要素の値が1の新規配列の生成 cv2.line : 直線描画 cv2.ims…