1.はじめに
OpenCVの読み取り画像を使用して、グレースケール画像、グレースケール画像のヒストグラムの描画に変換されます。ヒストグラム、コンソール出力ピクセルのグレーレベルの数をクリックしてください。
2.原理
(1)原理は簡単であり、主な利点は、OpenCVの画像を読み取り、グレースケール画像に変換します。
srcImg =関数imread(" ... ")。 // 「....」代表图像地址 場合(srcImg.empty()){ リターン - 1 。 } 関数imshow(WINDOW_SRCIMG、srcImg)。 マットgrayImg; cvtColor(srcImg、grayImg、CV_BGR2GRAY)。 関数imshow(WINDOW_GRAYIMG、grayImg)。
(2)新しいクラスマットキャンバス固定解像度を使用することは、各グレーレベルピクセルヒストグラムの統計数がキャンバスに描画されました。
int型 NROWS = 700、ここでNCOLS = 600 ; マットg_dstImg(NROWS、ここでNCOLS、CV_8UC1、スカラー::すべて(0)); // 新しいキャンバス
このプログラムで使用キャンバスを超えて高いグレーレベル範囲を、回避しながらキャンバス方法を縮小されます。
int型 MAXCOUNT = arrayMax(グレーレベル、256); // ピクセルの数までのグレーレベルの一定の数を見て yscaleRate = ダブル(NROWS)/ MAXCOUNT; // スケーリングY ダブル xscaleRateをここNCOLS = / 256 ; / / X-スケーリング
3.実装の詳細
// ヒストグラムの.cppは:エントリポイントのコンソールアプリケーションを定義します。 // トピック:グレースケールのヒストグラムを描き、ソースを明記してください:Chen_HW(https://www.cnblogs.com/chen-hw/p/11668119.html)
// ENV:VS2015デバッグ+のx64 + OpenCV3 .4.1 // 日付:Chen_HWのによって2018年11月22日
の#include " STDAFX.H " の#include <opencv2 / opencv.hpp> の#include <入出力ストリーム> の#define WINDOW_SRCIMG "[]図源" の#define WINDOW_GRAYIMG「] [グレースケール" の#define WINDOW_HIST" []ヒストグラム" 使用 名前空間STD; 使用 名前空間CV; INT arrayMax(INT g_arr []、INT NUM)。 マットdrawHist(マット&g_srcImg)。 ボイド MouseHandle(int型の イベント、int型のx、int型の Y、int型フラグを、ボイド *のPARAM)。 ポイントクリッカブル・ポインター、displayPoint。 BOOL downFlag = 偽; マットsrcImg; ダブル yscaleRate = 0 ; INT メイン() { システム(" 色3F " )。 srcImg =関数imread(" ... ")。 // 「....」代表图像地址 場合(srcImg.empty()){ リターン - 1 。 } 関数imshow(WINDOW_SRCIMG、srcImg)。 マットgrayImg; cvtColor(srcImg、grayImg、CV_BGR2GRAY)。 関数imshow(WINDOW_GRAYIMG、grayImg)。 マットhistImg = drawHist(grayImg)。 関数imshow(WINDOW_HIST、histImg)。 setMouseCallback(WINDOW_HIST、MouseHandle、(ボイド *)&histImg)。// (void *型)&srcImg传递给のvoid *ののparam waitKey(); リターン 0 ; }
マットdrawHist(マット&g_srcImg){ int型 NROWS = 700、NCOLS = 600; マットg_dstImg(NROWS、ここNCOLS、CV_8UC1、スカラー::すべて(0 )); //新しいキャンバス INTグレーレベル[ 256 ] = { 0 }; のため(int型 I = 0 ;私はg_srcImg.rowsを<; ++ I) { ため(INT J = 0 ; J <g_srcImg.cols; ++ J){ グレイレベル[(INT)g_srcImg.at <UCHAR>(I、J)] ++ ; } } int型 MAXCOUNT = arrayMax(グレーレベル、256) ; // ピクセルの最大数のグレーレベルの数を探し yscaleRate = ダブル(NROWS)/ MAXCOUNT; // Yスケーリング ダブルここxscaleRateをNCOLS = / 256 ; // Xスケーリング INT YAXIS [ 256 ]、XAXIS [ 257 ]; のための(INT、M = 0、M < 256 ; M ++ ){ YAXIS [ M] = INT(グレイレベル[M] * yscaleRate); } // ヒストグラムを描く ため(INT N- = 0 ; N- < 256 ; N - ++ ){ IF(N - == 255 ){ XAXIS [N-+ 1 ] = N-XAXIS []; } 矩形(g_dstImg、ポイント(XAXIS [N-]、YAXIS [N-])、ポイント(XAXIS [N- + 1 ]、0)、スカラー(255)、 - 1。); // 、パディング値は、グレースケール画素の数の分布を観察するために、より便利な、長方形のフレームではなく表し-1塗りつぶされた四角形を表す // しかし理由後充填を使用する必要性、状態を埋めるように配置されている } を返す。g_dstImgを }
/ / NUM:配列要素の数; G_MAX:返す最大 INT arrayMax(INT g_arr []、INT int型NUM){ G_MAX = 0 ; int型 I = 0 ; ながら(I < ){NUM IF(g_arr [I]> = G_MAX){ G_MAX = g_arr [I]; 私は ++ ; } 他{ 私は ++ ; } } 戻りG_MAX; } // X(例えば、マウスの左ボタン、左リフト、マウスの動きを押すなど)イベントマウスイベント、マウスのy座標 空隙 MouseHandle(int型の イベント、のint X、int型 Yを、INTフラグボイド *のPARAM){ マット&g_srcImg = *(MAT * )(PARAM); マットg_tempImg = g_srcImg.clone(); INT nCount = 0 ; // 白画素の列番号 INT nLevelCount = 0 ; char型テキスト[ 20です ] ; // ストアテキスト情報 フロート g_rate; // ピクセル列のピクセルの合計数の割合 関数imshow(WINDOW_HIST、g_srcImg); スイッチ(イベント){ ケースEVENT_LBUTTONDOWN: clickPoint.x = Y。 X。 clickPoint.y = downFlag = 真; 破ります; デフォルト: 休憩; } であれば(downFlag){ // displayPoint.x = clickPoint.x。 以下のために(int型 i = 0 ; iはg_srcImg.rowsを<; ++ I){ 場合(INT(g_srcImg.at <UCHAR>(I、X))== 255 ){ ++ nCount。 } } nLevelCount =(nCount / yscaleRate)。 g_rate = フロート(NCount / yscaleRate)/(srcImg.rows * srcImg.cols); // 比は、ここで算出されていない正確 << COUT " グレースケール画素の数:" << << nLevelCount " ;合計画素数の割合:" << g_rate << ENDL; sprintf_s(テキスト、" 料金:%F "、g_rate); // 合計数の階調の画素比率の数; putText(g_tempImg、テキスト、クリッカブル・ポインター、FONT_HERSHEY_PLAIN、1。スカラー(255、0、255 )); 関数imshow(WINDOW_HIST、g_tempImg); downFlag = falseに; } }
4.結果
結果は、以下の各コンソール意志出力グレーレベルの画素数、総表示画素の割合で、右をクリックするためのヒストグラムを示します。