目次
公式オンライン ヘルプ ドキュメント: OpenCV: OpenCV モジュール
OpenCV を使用して画像に対していくつかの簡単な操作を行う
公式オンライン ヘルプ ドキュメント: OpenCV: OpenCV モジュール
OpenCV を使用して画像に対していくつかの簡単な操作を行う
1. 画像ヒストグラム
画像ヒストグラムの解釈
画像ヒストグラムは画像のピクセル値の統計的特徴であり、計算コストが低く、画像の移動、回転、スケーリングの不変性など多くの利点があります。
これは、画像処理のさまざまな分野、特にグレースケール画像のしきい値セグメンテーション、カラーベースの画像検索、画像分類、逆投影追跡などで広く使用されています。
一般的に分けられるのは、
- 灰色のヒストグラム
- カラーヒストグラム
ビンとは、ヒストグラムのサイズ範囲を指します。0 から 255 までのピクセル値の場合、少なくとも 256 のビンがあります。さらに、16、32、48、128 などもあります。256 を で割ったサイズです。 bin は整数倍である必要があります。
OpenCV の関連 API
calcHist(&bgr_plane[0],1,0,Mat(),b_hist,1,bins,ranges);
cv.calcHist([画像],[i],なし,[256],[0,256])
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace cv;
using namespace std;
class demo
{
public:
// 图像直方图
void histogram_demo(Mat& image) {
// 三通道分离
vector<Mat> bgr_plane;
split(image, bgr_plane);
// 定义参数变量
const int channels[1] = { 0 };
const int bins[1] = { 256 };
float hranges[2] = { 0,255 };
const float* ranges[1] = { hranges };
Mat b_hist;
Mat g_hist;
Mat r_hist;
//计算Blue, Green,Red通道的直方图
calcHist(&bgr_plane[0], 1, 0, Mat(), b_hist, 1, bins, ranges);
calcHist(&bgr_plane[1], 1, 0, Mat(), g_hist, 1, bins, ranges);
calcHist(&bgr_plane[2], 1, 0, Mat(), r_hist, 1, bins, ranges);
//显示直方图
int hist_w = 512;
int hist_h = 400;
int bin_w = cvRound((double)hist_w / bins[0]);
Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3);
//归一化直方图数据
normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());
// 绘制直方图曲线
for (int i = 1; i < bins[0]; i++) {
line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),
Point(bin_w * (i), hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, 8, 0);
line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),
Point(bin_w * (i), hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, 8, 0);
line(histImage, Point(bin_w * (i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))),
Point(bin_w * (i), hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2, 8, 0);
}
// 显示直方图
namedWindow("Histogram Demo", WINDOW_AUTOSIZE);
imshow("Histogram Deno", histImage);
}
};
int main(int argc, char** argv)
{
Mat src = imread("迪丽热巴.png",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.histogram_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
2. 画像二次元ヒストグラム
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace cv;
using namespace std;
class demo
{
public:
// 二维直方图
void histogram_2d_demo(Mat& image)
{
// 2D直方图
Mat hsv, hs_hist;
cvtColor(image, hsv, COLOR_BGR2HSV);
int hbins = 30, sbins = 32;
int hist_bins[] = { hbins, sbins };
float h_range[] = { 0,180 };
float s_range[] = { 0,256 };
const float* hs_ranges[] = { h_range, s_range };
int hs_channels[] = { 0,1 };
calcHist(&hsv,1, hs_channels,Mat(), hs_hist,2, hist_bins, hs_ranges, true, false);
double maxval = 0;
minMaxLoc(hs_hist, 0, &maxval, 0, 0);
int scale = 10;
Mat hist2d_image = Mat::zeros(sbins * scale, hbins * scale, CV_8UC3);
for (int h = 0; h < hbins; h++) {
for (int s = 0; s < sbins; s++) {
float binVal = hs_hist.at<float>(h, s);
int intensity = cvRound(binVal * 255 / maxval);
rectangle(hist2d_image, Point(h * scale, s * scale),
Point((h + 1) * scale - 1, (s + 1) * scale - 1),
Scalar::all(intensity),
-1);
}
// 输出图像色彩转换
applyColorMap(hist2d_image, hist2d_image, COLORMAP_JET);
imshow("H-S Histogram", hist2d_image);
// imwrite("D:/ hist__2d.png", hist2d_image);
}
}
};
int main(int argc, char** argv)
{
Mat src = imread("迪丽热巴.png",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.histogram_2d_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
3. 画像ヒストグラム均等化
画像ヒストグラムの等化
画像ヒストグラム等化は、画像強調、入力画像のヒストグラム等化処理、後続のオブジェクト検出の精度向上に使用でき、OpenCV 顔検出のコード デモンストレーションで非常に一般的です。さらに、医療画像画像や衛星リモートセンシング画像では、画質を向上させるためにヒストグラム等化がよく使用されます。
API
- イコライズヒスト(src,dst)
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace cv;
using namespace std;
class demo
{
public:
// 直方图均衡化
void histogram_eq_demo(Mat& image)
{
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
imshow("灰度图像", gray);
Mat dst;
equalizeHist(gray, dst);
imshow("图像直方图均衡化演示", dst);
}
};
int main(int argc, char** argv)
{
Mat src = imread("迪丽热巴.png",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.histogram_eq_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
4. 画像畳み込み演算
関連する API (C++)
- ぼかし(
InputArray src, //入力
OutputArray dst, //出力
サイズ ksize, //ウィンドウサイズ
ポイントアンカー = Point(-1,-1), //デフォルト値
int borderType = BORDER_ _DEFAULT //デフォルト値)
Pythonのバージョン
dst= cv.blur( src, ksize[, dst[,アンカー[, borderTyel]] )
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace cv;
using namespace std;
class demo
{
public:
// 图像卷积操作
void blur_demo(Mat& image)
{
Mat dst;
blur(image, dst, Size(23,23), Point(-1, -1));
// 支持一维卷积---->Size(15,1)
imshow("图像模糊", dst);
}
};
int main(int argc, char** argv)
{
Mat src = imread("迪丽热巴.png",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.blur_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
5. ガウスぼかし
画像の平均化とガウスぼかし
平均ぼかしは、コンボリューション カーネルの係数がまったく同じであることを意味します。ガウスぼかしは、中心ピクセル距離の影響を考慮し、ガウス分布式を使用してコンボリューション カーネルの異なる重み係数を生成し、このコンボリューション カーネルを使用します。出力結果は、画像のガウスぼかし後の出力です。
OpenCV ガウスブラー API 関数
void GaussianBlur(
入力配列ソース、
出力配列 dst、
サイズ ksize, // Ksize はガウス フィルター ウィンドウ サイズです
double sigmax, //X 方向のフィルター係数
double sigmaY=O, // Y 方向のフィルター係数
int borderType=BORDER_DEFAULT //デフォルトのエッジ補間方法 )
Size(0,0) が sigmax からガウス コンボリューション カーネル係数の計算を開始するとき、サイズがゼロでない場合は、サイズからガウス コンボリューション カーネル係数を計算することが推奨されます。
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace cv;
using namespace std;
class demo
{
public:
// 高斯模糊
void gaussian_blur_demo(Mat& image)
{
Mat dst;
GaussianBlur(image, dst, Size(0, 0), 15);
// Size(0, 0)是最厉害的模糊
imshow("高斯模糊图像", dst);
}
};
int main(int argc, char** argv)
{
Mat src = imread("迪丽热巴.png",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.gaussian_blur_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}
6. ガウス両側ブラー (エッジ フィルタリング)
エッジ保存フィルタリング アルゴリズム – ガウス両側ぼかし
先ほど紹介した画像の畳み込み処理は、平均値でもガウスでもファジー畳み込みであり、ぼかした後に画像のエッジ情報が存在しなくなるという共通点があります。
破損した。今回紹介したフィルタリング手法は、コンボリューション処理により画像のエッジを傷つけることなくぼかしをかけることができ、フィルタリング後の出力では画像全体のエッジ(輪郭)情報を完全に保持することができ、このタイプのフィルタリングアルゴリズムをフィルタリングアルゴリズムと呼びます。エッジ保存 フィルター アルゴリズム (EPF)。最も一般的なエッジ保存フィルタリング アルゴリズムは次のとおりです。
ガウスの両側ぼかし
平均シフト ファジー 局所平均二乗誤差 ファジー
OpenCV にはエッジ保持フィルタリング用の専用 API もあります
ガウスぼかしは、重みに対する画像の空間位置の影響を考慮しますが、画像の畳み込み出力に対する画像のピクセル分布の影響は考慮しません、バイラテラルぼかしは、ピクセル値分布の影響を考慮し、重みの大きな差を留保します。完成したピクセル値の空間分布 画像のエッジ情報が保存されます。
C++:
双方向フィルター(
入力配列ソース、
出力配列 dst、
int d、
ダブルシグマカラー、
ダブルシグマ空間、
int borderType = BORDER_DEFAULT
)
パイソン:
dst =cv.bi LateralFilter(src,d, sigmaColor, sigmaSpace[, dst[,borderType]] )
#include<opencv2/opencv.hpp>
#include<iostream>
#include<vector>
using namespace cv;
using namespace std;
class demo
{
public:
// 高斯双边模糊
void bifilter_demo(Mat& image)
{
// 磨皮美颜
Mat dst;
bilateralFilter(image, dst, 0, 100, 10);
imshow("双边模糊", dst);
}
};
int main(int argc, char** argv)
{
Mat src = imread("迪丽热巴.png",IMREAD_UNCHANGED);
// Mat是一种特殊的数据类型格式,是一种二维数组,用来存储图片的数据
// namedWindow("输出窗口", WINDOW_FREERATIO);
// 只有imshow无法调整图片显示窗口的大小,通过namedWindow调整窗口的大小
if (src.empty()) {
cout << "没有找到你的图片" << endl;
return -1;
}
imshow("输出窗口", src);
demo d;
d.bifilter_demo(src);
waitKey(0);// 设置图片显示时间
destroyAllWindows();// 释放所有窗口
return 0;
}