あいどる💖たいむ

あいどるやってます。

OpenCVでのリサイズと切り取り

画像を正方形にリサイズする。
画像の短辺を正方形の辺の長さ®ã«åˆã‚ã›ã¦ä¸­å¤®ã«é…ç½®ã—、長辺のはみでた部分は切り捨てる。

コード

import cv2

def resize_and_crop_square(img, r):
    """
    画像を正方形に切り取る
    短辺をrに合わせるようリサイズし、長辺のはみ出す部分は切り捨てる
    :param img:
    :param r: 正方形の辺の長さ
    :return: resized image
    """
    org_h, org_w = img.shape[:2]

    if org_h > org_w:
        h = int(org_h * r / org_w)
        w = r
    else:
        h = r
        w = int(org_w * r / org_h)

    # resize
    w = max(w, r)
    h = max(h, r)
    img2 = cv2.resize(img, (w, h))

    # crop
    top = (h - r) // 2
    left = (w - r) // 2
    return img2[top:top + r, left:left + r]

_img = cv2.imread('images/pexels-photo-297743.jpeg', cv2.IMREAD_COLOR)
_img2 = resize_and_crop_square(_img, 256)
cv2.imshow('res', _img2)
cv2.waitKey(0)

実行結果

左が元画像、右が編集後の画像

f:id:shiccocsan:20170622193937j:plain

OpenCVを使って彩度を変更する

OpenCVを使って彩度の変更をしてみる。

環境 

>>> import cv2
>>> cv2.__version__
'3.2.0'

実装

大まかな流れ

  1. cv2.imreadで画像読み込み
  2. 彩度をあつかうので、RGBからHSVへ変換(OpenCVで読み込んだ配列はBGRの並び)
  3. 各ピクセルの彩度(index:1)を変更する。ここでは0.3倍
  4. HSVからRGBに戻し、保存と表示

ちなみに、HSVの値の範囲は、

For HSV, Hue range is [0,179], Saturation range is [0,255] and Value range is [0,255].

とのこと。

OpenCV: Changing Colorspaces

コード

import cv2
import numpy as np

img = cv2.imread('images/pexels-photo-297743.jpeg', cv2.IMREAD_COLOR)
dst = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)  # BGRからHSVへ変換

print(dst.shape)

for i in range(dst.shape[0]):
    for j in range(dst.shape[1]):
        # Vの値を上書きする
        dst[i, j, 1] = int(dst[i, j, 1] * 0.3)

img = cv2.cvtColor(dst, cv2.COLOR_HSV2BGR)  # HSVからBGRに戻す
cv2.imshow('res', img)
cv2.imwrite('images/result.jpg', img)
cv2.waitKey(0)

実行結果

左が元画像、右が変換後の画像。 彩度が下がっていることは明らか。

f:id:shiccocsan:20170622161554j:plain

おわりに

彩度の変更は、numpy配列の演算で1ピクセルごとでなく一括で変更できるのではないかと思う。

参考

HSV色空間 - Wikipedia

OpenCV: OpenCV modules

jlisting.styの導入

LaTeXにソースコードを埋め込むにはlisting.styを使うが,ソースコードに日本語を含む場合はjlisting.styが必要とのこと.なので導入.

環境

macに以下の本のDVDでLaTeXをインストールした状態.

[改訂第7版]LaTeX2ε美文書作成入門

[改訂第7版]LaTeX2ε美文書作成入門

jlisting.styを導入

jlisting.styをダウンロードする
http://prdownloads.sourceforge.jp/mytexpert/26068/jlisting.sty.bz2

つぎのように,解凍したjlisting.styをlistingsのディレクトリにコピー

sudo cp jlisting.sty /Applications/TeXLive/Library/texlive/2016/texmf-dist/tex/latex/listings

ls-Rの更新

ls-Rを更新する必要があるようなので,mktexlsrを実行

sudo mktexlsr

LaTeXサンプル

実際に,使用してみる.

コード

Â¥documentclass[papersize]{jsarticle}

%listingsの設定
Â¥usepackage{listings,jlisting }
Â¥usepackage{color}

% ソースコードのスタイル設定
Â¥lstset{% 
language={python}, 
basicstyle={Â¥small},% 
identifierstyle={Â¥small},% 
commentstyle={¥small¥ttfamily ¥color[rgb]{0,0,0}},% 
keywordstyle={¥small¥bfseries ¥color[rgb]{0,0,1}},% 
ndkeywordstyle={Â¥small},% 
stringstyle={¥small¥ttfamily}, 
frame={tb}, 
breaklines=true, 
columns=[l]{fullflexible},% 
numbers=left,% 
xrightmargin=0zw,% 
xleftmargin=3zw,% 
numberstyle={Â¥scriptsize},% 
stepnumber=1, 
numbersep=1zw,% 
morecomment=[l]{//}% 
} 

Â¥begin{document}
Â¥begin{lstlisting}[caption=spam,label=ham] 
   # 入力
   hoge = input()
   # 出力
   print(hoge)
Â¥end{lstlisting}

Â¥end{document}

スタイルはlstsetに記述するらしい.
サンプルのものは,以下サイトからお借りした.
http://www.biwako.shiga-u.ac.jp/sensei/kumazawa/tex/listings.html

出力

f:id:shiccocsan:20170607141037p:plain

参考

chainercvを動かしてみた

写真の被写体の個数に応じて処理をしたいなと思ったので,chainercvを使って物体検出してみた. github.com

環境

インストールはInstallationのとおり

実装

gist.github.com

モデルはSSD512というのを使用.
ほとんどexampleどおりだけど,モデルを作成したらpickleで保存するようにしてみた.

実行結果

f:id:shiccocsan:20170531131318p:plain

こんなかんじで検出箇所を囲ってくれる(≧∇≦)b

テスト用画像は以下のものをお借りした
https://www.pexels.com/photo/building-buildings-busy-car-297743/

Scilab/Scicosはじめた

使い方が難しい(*>△<)

はたして、シュミレーションできるようになるのか?

ステップ関数の加算に成功した!

f:id:shiccocsan:20170511233309j:plain

グリッドの表示に成功した!

f:id:shiccocsan:20170511233316j:plain

abc025_c

C: 双子と○×ゲーム - AtCoder Beginner Contest 025 | AtCoder

はじめてミニマックス法の問題を解いた。 ミニマックス法 - Wikipedia

解法メモ

スコアの"最大値を目指す"と、"最小値を目指す"を交互に繰り返し、スコアの最大値を求めるってイメージ。
コード的には全探索と同じようなコードになる。
ただ、途中で同じ盤面の状態になることがあるから、一度発生した盤面でのスコア最大値はメモしておく。

コード

A = [[0] * 3 for i in range(3)]  # 盤面(0:null, 1:dai, -1,ko)
B = [list(map(int, input().split())) for _ in range(2)]
C = [list(map(int, input().split())) for _ in range(3)]


def get_key():
    return tuple(tuple(A[_]) for _ in range(3))


memo = dict()

SUM_SCORE = 0
for i in range(3):
    for j in range(2):
        SUM_SCORE += B[j][i] + C[i][j]


def score():
    res = 0
    for i in range(3):
        for j in range(2):
            if A[j][i] != A[j + 1][i]:
                res += B[j][i]
            if A[i][j] != A[i][j + 1]:
                res += C[i][j]
    return SUM_SCORE - res


def min_max(position):
    if position == 9:
        return score()

    stat = get_key()
    if stat in memo.keys():
        return memo[stat]

    res = -1e10
    sign = -1 if position % 2 else 1

    for i in range(3):
        for j in range(3):
            if not A[i][j]:
                A[i][j] = sign
                res = max(res, sign * min_max(position + 1))
                A[i][j] = 0

    memo[get_key()] = sign * res
    return sign * res


spam = min_max(0)
print(spam)
print(SUM_SCORE - spam)

リスト内包表記でタプルを作るときは、
tuple(i for i in range(3)) のように書く。
(i for i in range(3)) だとgenerator objectが返るから注意。

numpyの配列から上位n個を取得する

概要

numpy.darrayから値を比較し、上位n個を取得したい。
argsortを使えば実現できた。

環境

$ python --version
Python 3.5.1

argsortを使ってみる

argsortでソート後のindexのリストを取得できる
numpy.argsort — NumPy v1.12 Manual

In [1]: import numpy as np

In [3]: x = np.array([[0, 3, 1, 2],
   ...:        [1, 0, 2, 2],
   ...:        [4, 4, 4, 4]])
   ...:

In [4]: x
Out[4]:
array([[0, 3, 1, 2],
       [1, 0, 2, 2],
       [4, 4, 4, 4]])

# axis=0の場合(列ごとに比較するイメージ)
In [5]: np.argsort(x, axis=0)
Out[5]:
array([[0, 1, 0, 0],
       [1, 0, 1, 1],
       [2, 2, 2, 2]])

# axis=0の場合(行ごとに比較するイメージ)
In [6]: np.argsort(x, axis=1)
Out[6]:
array([[0, 2, 3, 1],
       [1, 0, 2, 3],
       [0, 1, 2, 3]])

# axisのデフォルトは-1(最後の次元)
In [7]: np.argsort(x)
Out[7]:
array([[0, 2, 3, 1],
       [1, 0, 2, 3],
       [0, 1, 2, 3]])

argsortを使って、上位2個を取得する

In [3]: np.argsort(x)[0][::-1][:2]
Out[3]: array([1, 3])

# 1つのスライスで処理するなら・・・
In [4]: np.argsort(x)[0][:-3:-1]
Out[4]: array([1, 3])

こんな感じでしょうか