物理の駅 Physics station by 現役研究者

テクノロジーは共有されてこそ栄える

OpenCV

Python+OpenCVで画像の丸っぽさと伸びている方向の角度を求める

OpenCVのmomentsを使って丸っぽさと、伸びている方向の角度を求めるコードを書いてみた。 関数moments_round_angleのXとYは以下の論文の定義通りである。これは、二次のモーメントの対称性を表す指標である。(ちなみに一次のモーメントからは重心などが求ま…

Pythonで複数のPNG画像をPDFファイルに変換する

画像からPDFにするためのパッケージ img2pdf が必要。 数字を自然順にソートするためのパッケージと関数 natsort natsorted が必要。 PNGファイルに透過チャンネルがある場合、 img2pdf.AlphaChannelError: Refusing to work on images with alpha channel …

OpenCV Pythonで画像の切り抜き (トリミング)

OpenCVでいうところのRectをやるには、配列の一部をスライスすればよい。 dst1 はY=164からHeight=2960、X=356からWidth=2028ピクセル分。XとYが逆になってることに注意。 import cv2 import glob files = glob.glob("*.jpg") i=0 for file in files: im = c…

C++ OpenCVでalphaチャンネルなし画像からalphaチャンネルを作る

入力画像は、アルファチャンネルあり、なしBGR、グレースケールの3種類に対応した。 アルファチャンネルは8bitの4チャンネルの4つ目で、0-255で与える。0の場合は完全に透過する。 今回は、BGRの輝度値が真っ白付近(245-255)を透過する条件とした。 変換前(…

OpenCVのPNG形式でエンコードする時の各パラメータの圧縮率と圧縮時間について

OpenCVで画像をPNGファイル、すなわち可逆な形式で圧縮し、ファイルで出力することなくデータを取得したいとき、 cv::imencode というエンコード関数を使う。原理的には以下のように記述する。(そのままでは動かないよ) vector<int> params = vector<int>(2); params[0</int></int>…

PocoとOpenCV: 共有メモリを使ってプロセス間で画像を送受信する

PocoとOpenCVによる画像の共有メモリ経由での書き込み・読み出しの実装例 画像を共有メモリから読み出す OpenCVには、画像の先頭のポインタ sm.begin() を与えると自動的に画像として読んでくれるコンストラクタがあるので、それを利用した。 書き込む方と同…

16bitモノクロ画像を8bitモノクロ画像に変換するコード

16bitモノクロ画像の輝度値の最小が3802、最大が11113とする。 import numpy as np import cv2 src= cv2.imread("input.tif",-1) src=np.add(src, -3802) src=src*(255/(11113-3802)) dst = src.astype(np.uint8) cv2.imwrite("output.png",dst) 注意点: imr…

Pythonで画像のラベリング→輝度値0以外の領域を分割して領域ごとの座標と輝度値リストを取得する

バージョン3以降のOpenCVには、画像のラベリングできる関数が実装されている。 connectedComponents は、入力画像と同じサイズの画像にラベルの番号が書かれた画像を返してくれる。 connectedComponentsWithStats はStats、すなわち面積、重心等を含めた情報…

SPNG形式(バイナリ形式で複数の画像を1ファイルに統合した独自形式)のPythonでの読み込み方

諸事情で複数の画像を簡易的に1つのファイルに統合したいことがあり、またそのファイルをPythonから読み込みたい需要があった。 Numpyを使ったバイナリファイルの読み込み方、OpenCVを使ったデコードの仕方などの知識を使う。 V00000001_L0_VX0001_VY0000_ma…

C++ OpenCV の cv::encode, cv::decodeを使ってみる

C++ OpenCVの導入、サンプル画像の作り方は Visual Studio 2017 + OpenCV 3.2.0 + x64の初期設定 とOpenCVに関する質問の受け付け(コメント欄へ) - 物理の駅 by onsanai を参照されたし。 cv::encode cv::decode を使うと、ファイル出力なしに出力用のバイト…

Python+OpenCVで確率的ハフ変換を用いた直線認識

グレースケールで上記の画像を読み込む。 31x31のカーネルサイズのガウシアンフィルタをかける ガウシアンフィルタをかけた画像から元画像を引く しきい値 18 の処理をかける 確率的ハフ変換を行う 直線を描画する # %% import cv2 import numpy as np img =…

点列で表された道のりを、ある長さごとに区切るアルゴリズム C++

点列を表すのにOpenCVの cv::Point2f を使ったが、OpenCVライブラリは使ってないので適宜置き換えて欲しい。 最後から1つめと、最後の点との距離はlengthではない。 std::vector<cv::Point2f> cell_length(const std::vector<cv::Point2f>& points, double length) { assert(points.siz</cv::point2f></cv::point2f>…

OpenCVのサンプルコードを Python + OpenCV + numpy版に書き換える

書き換えるのは下記で紹介してるコード phst.hateblo.jp import cv2 import numpy as np src = np.zeros((150, 220, 3), np.uint8) cv2.putText(src, "Hello World", (5, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 200), 2, cv2.LINE_AA) cv2.line(src, (19…

LattePanda 1st edition (Z8350) + Ubuntu + OpenCV by Pythonで画像処理をしてみる

VSCodeをインストールする $ sudo snap install --classic code Pythonをインストールする www.python.jp pip、OpenCV、NumPy等のインストールを行う pip3 install opencv-python --user pip3 install numpy --user pip3 install matplotlib --user 次の記事…

CCDカメラで撮像した画像をOpenCVを使って縞々模様を除去する

CCDカメラは読み出し方式による縞々模様(1行ごとに輝度の濃淡が発生する)現象が起こる。 通常、ハードウェア側で調整されるものだが、ソフトウェア側で調整する必要に迫られたので、そのコードを公開する。 なお、Visual Studio + C# + OpenCVSharp と C++を…

OpenCVを使った画像内のピーク検出プログラム

ピークの周波数によって、途中のBoxFilterとGaussianBlurのカーネルサイズは変えると良い。 背景の強度を求めて、有意度を求めるのがこのプログラムのミソである。 var size = new OpenCvSharp.Size(nbin, nbin); Mat signal = Mat.Zeros(size, MatType.CV_3…

OpenCV 2系でGPUで膨張処理をさせる方法

OpenCV 2系でGPUで膨張処理をさせる方法で詰まったので書いておく。最後に検証に使った全コードがあるのでどうぞ。 CPUで膨張処理をさせるとき、さくっと書けば次のようになる。 cv::Mat src, dst; int width = 256; int height = 256; src = cv::Mat::eye(c…

Visual Studio 2017 + OpenCV 3.2.0 + x64の初期設定 とOpenCVに関する質問の受け付け(コメント欄へ)

Visual Studio 2017 x64 で OpenCV 3.4.2 を使う方法 OpenCVをとにかく使いたい。けどNuGetは使えない、使いたくないっていう人のために、この記事の最終更新時点での最新版のインストール方法を書きました。2.4.Xの頃と比べて.libの数が減って設定が楽になりま…

OpenCVのgpu::countNonZeroをgpu::Streamで高速化する

cv::gpu::countNonZeroをgpu::Streamで高速化したいという需要があったので、その解決策を書いておく。 opencvの2系のcountNonZeroはstreamを使うことが出来ない。そのため、非同期処理を行い高速化する際のボトルネックになる。cv::gpu::reduceは2次元画像…