2013年12月22日日曜日

[Android] 撮った写真を自動でバックアップするならBitcasaが便利


Androidで撮影した写真を自動でバックアップするためにはGoogle+に登録しないといけないのですが、あいにく僕はGoogle+を利用していません。そこで、何か他に良い方法はないかなーと探していたところ、最適なサービスを見つけました。

Bitcasaを使うと、簡単にAndroidで撮影した写真を自動でクラウドストレージにアップロード出来ます。

なぜBitcasaが良いと思ったのか、特徴とともに説明します。

無料で5GB〜20GBまで使える

Bitcasaに登録すると、無料アカウントでも標準で5GBのストレージが付いてきます。

さらに、スマホとPCにBitcasaのアプリケーションを入れるだけで、それぞれ500MBずつ容量が追加。合計で6GBを利用することが出来ます。スマホで撮影した写真が1枚あたり約3MBなので、ざっと2,000枚はバックアップ可能です。

また、他の人をBitcasaに招待すると、1人あたり1GBの容量が追加され、最大で20GBまで無料で利用できるようになります。一般的なスマホはデータフォルダの容量がが16GBか32GBくらいなので、十分すぎる量になるわけです。


設定が簡単

登録したはいいけど、アプリの設定が面倒だったり、使いにくかったりするのはあまりイケてないですよね。

その点、Bitcasaは非常にシンプルで使いやすいです。

撮影した写真を同期するには、設定の「カメラの自動アップロード」をオンにするだけ。写真をたくさん撮って転送量が気になる人は、「WiFiでのみアップロード・ダウンロード」を設定しておけば、WiFiに接続した時に自動で同期されます。



アプリが使いやすい

アプリの表示も簡潔で分かりやすくなっています。

メイン画面は、写真・音楽・ビデオ・文書と、ファイルの種類ごとにまとめられて表示されています。
例えば写真を選択すると、アルバムごとに写真の一覧がサムネイル表示されます。写真をタップすれば一枚ずつ拡大して閲覧でき、長押しすれば複数選択で共有したりお気に入り登録したりすることができます。
ギャラリーや他のエクスプローラ系のアプリと同様の挙動をするのでとても分かりやすいです。




アプリやウェブページの日本語対応など、まだイマイチな部分もありますが、それ以上に便利で使いやすいBitcasa!

アカウントの作成は、BitcasaのFreeプランの"Sign Up"から行えます。


2013年12月12日木曜日

[OpenCV] PythonのOpenCVで特定の色の画像を判別

複数の画像の中から、特定の色(の多い)の画像のみを抽出する方法を考えてみました。


1.RGB値の平均を求める方法


例えば、このトマトの画像が「赤い」かを判別してみます。



>>> import cv2
>>> img = cv2.imread('tomato.jpg')
>>> averages = img.mean(0).mean(0) # BGRの値を全ピクセルで平均した値
>>> averages
array([ 184.32241784,  194.90715962,  241.32643779])
>>> blue_average, green_average, red_average = averages
>>> if red_average > green_average and red_average > blue_average:
...     print "The image is RED"
... 
The image is RED

img.mean(0).mean(0) では、BGRの値を全ピクセルで平均した値を求めています。

いわゆる赤が BGR = (0, 0, 255) で表されるので、Rの値がBやGよりも大きければ赤い画像です(厳密にはBとGの値が同じくらいで、Rよりも有意に小さい必要がありますが)

この画像では、B,Gの平均値が約190であるのに対してRの平均値が240なので、「赤い」画像であると言って良さそうです。


2.BGRをHSVに変換して、色相から判別する方法


ウェブページなどではいわゆるRGB値(赤青緑)を用いて色を表現しますが、HSV値(色相・彩度・明度)を用いて色を表現する方法があります。

HSV色空間 - Wikipedia

このH(色相)を用いることで、画像が「赤い」かを判別することができそうです。

>>> import cv
>>> import cv2
>>> img_bgr = cv2.imread('tomato.jpg')
>>> img_hsv = cv2.cvtColor(img_bgr, cv.CV_BGR2HSV) # 画像をBGRからHSV色空間に変換
>>> average_hue = img_hsv[:,:,0].mean() # Hの値を全ピクセルで平均した値
>>> average_hue
11.173327464788729

ここで、赤が最も強い(Rの値がB,Gよりも高い)場合、H(色相)は300°〜60°に分布します(OpenCVでは値域が0〜179のため0〜30,150〜179)。よって、色相の平均値がこの値の範囲に収まっていれば、「赤い」画像になります。

ただし、色相を使う場合には注意点が一つあり、真っ白な点や真っ黒な点のように、どの色相にもあてはまる点の色相は0になります。このような点を含めて平均値を求めてしまうと、平均値は必ず0に近い値になってしまいます。このような点を排除するため、S(彩度)の値を使います。

彩度とは読んで字の如く「色の鮮やかさ」のことで、白や黒は0.0、赤・緑・青は1.0(100%, OpenCVでは255)です。よって、この彩度に閾値を設け、彩度が一定の値よりも低い点を排除して平均を求めることで、より正しい色相を求めることが出来ます。

以下が修正版のコードです。

>>> import cv
>>> import cv2
>>> img_bgr = cv2.imread('tomato.jpg')
>>> img_hsv = cv2.cvtColor(img_bgr, cv.CV_BGR2HSV) # 画像をBGRからHSV色空間に変換
>>> valid_hue_list = [[ hsv[0] for hsv in img_line if hsv[1] > 0]
... for img_line in img_hsv] #彩度が0より大きい点のみを採用
>>> average_hue = (sum([sum(line) for line in valid_hue_list]) / 
... float(sum([len(line) for line in valid_hue_list])))
>>> average_hue
21.157771912765661

先程よりも0から遠い、大きな値になりました。純粋な赤色ならばHの平均値は0.0になるはずですが、トマトのヘタは緑色(OpenCVでは色相の値が60.0)なので、その値に引っ張られて約20になったと思われます。


このように色相の平均を求めることで簡易的に色を判別できますが、他にも様々な方法が考えられます。

例えば、色相が赤・緑・青に属するピクセル数を数えて、その大きさが一定値を超えたらその色の画像である、と判断するような方法も考えられます。対象とする画像の特徴と計算時間等を考えることで、より良い方法が見つかるはずです。



2013年12月11日水曜日

[MacOSX] InterCheckというプロセスがCPUを占領している時の対応方法


なんか最近Macが重いなーと思ったら、InterCheckという名前のプロセスがCPUを1つ独占していました。これはどうやらSophos Anti-Virusのプロセスらしい。

さらに調べてみると、MacにインストールされていたSophosのバージョンが8で最新版ではないのが良くないみたい。

というわけで、古いSophosをアンインストールして新しいSophosをインストールしました。
今のところ、これで悪さをしなくなりました。


1.古いSophosのアンインストール


古いSophosは、/Library/Sophos Anti-Virus/Remove Sophos Ant-Virus.pkg からアンインストールできます。

Finderでの開き方がわからない人は、ターミナルを開いて open /Library/Sophos Anti-Virus/ と打つと Finder が開きます。

インストーラとか書いてあるけど、アンインストールされるのでそのまま実行してください。

メニューバーからSophosのアイコンが消えたら成功です。

詳しい方法は、Sophos Anti-Virus for Mac OS X アンインストール手順 (OS X 10.6 編)を参照。


2.新しいSophosのインストール


最新版のSophos9も個人利用ならば無償でダウンロードできます。

ちなみに Sophos 9.05(2013/12/11時点の最新版)から Mac OSX 10.9 Marvericksに対応しているそうです。

ダウンロードは、 Sophos Anti-Virus for Mac Home Edition から行うことが出来ます。



いやはや、もっと早く気付けばよかった。

[OpenCV] PythonのOpenCVで画像の連結

>>> import cv2
>>> img1 = cv2.imread('iphone.png')
>>> img2 = cv2.imread('imac.png')
>>> img3 = cv2.vconcat([img1, img2]) # 縦方向の連結
>>> cv2.imwrite('vconcat.png', img3)
True
>>> img4 = cv2.hconcat([img1, img2]) # 横方向の連結
>>> cv2.imwrite('hconcat.png', img4)
True

縦方向に連結した結果


横方向に連結した結果

2013年12月10日火曜日

[OpenCV] PythonのOpenCVで直線の描画

>>> import cv2
>>> img = cv2.imread('元の画像パス')
>>> cv2.line(img, (5, 5), (5, 100), (0, 0, 255)) # Draw Red Line
>>> cv2.line(img, (20, 20), (100, 20), (255, 0, 0), 3) # Draw Thick Blue Line
>>> cv2.line(img, (0, 0), (120, 120), (0, 255, 0), 5) # Draw Very Thick Green Line
>>> cv2.imwrite('出力先の画像パス', img)
True

こんな感じ。