日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

opencv 绘制坐标曲线_OpenCV手工实现灰度及RGB直方图

發布時間:2025/3/11 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 opencv 绘制坐标曲线_OpenCV手工实现灰度及RGB直方图 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

#include #include#include#include#include#include#include#include#include

using namespacecv;using namespacestd;//單通道圖片直方圖繪制

void drawHist(vectornums)

{

Mat hist= Mat::zeros(600, 800, CV_8UC3);

auto Max= max_element(nums.begin(), nums.end());//max迭代器類型,最大數目

putText(hist, "Histogram", Point(150, 100), FONT_HERSHEY_DUPLEX, 1, Scalar(255, 255, 255));//*********繪制坐標系************// Point o = Point(100, 550);

Point x= Point(700, 550);

Point y= Point(100, 150);//x軸

line(hist, o, x, Scalar(255, 255, 255), 2, 8, 0);//y軸

line(hist, o, y, Scalar(255, 255, 255), 2, 8, 0);//********繪制灰度曲線***********// Point pts[256];//生成坐標點

for (int i = 0; i < 256; i++)

{

pts[i].x= i * 2 + 100;

pts[i].y= 550 - int(nums[i]*(300.0/(*Max)));//歸一化到[0, 300]//顯示橫坐標

if ((i + 1) % 16 == 0)

{string num = format("%d", i + 1);

putText(hist, num, Point(pts[i].x,570), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 255, 255));

}

}//繪制線

for (int i = 1; i < 256; i++)

{

line(hist, pts[i- 1], pts[i], Scalar(0, 255, 0), 2);

}//顯示圖像

imshow("直方圖",hist);

}//三通道圖片直方圖繪制

void drawHist(vector &r, vector &g, vector &b)

{

Mat hist= Mat::zeros(600, 800, CV_8UC3);

putText(hist,"Histogram", Point(150, 100), FONT_HERSHEY_DUPLEX, 1, Scalar(255, 255, 255));//*********繪制坐標系************// Point o = Point(100, 550);

Point x= Point(700, 550);

Point y= Point(100, 150);//x軸

line(hist, o, x, Scalar(255, 255, 255), 2, 8, 0);//y軸

line(hist, o, y, Scalar(255, 255, 255), 2, 8, 0);//********繪制灰度曲線***********// auto Max_r =max_element(r.begin(), r.end());

auto Max_g=max_element(g.begin(), g.end());

auto Max_b=max_element(b.begin(), b.end());

Point pts[3][256];//生成坐標點

for (int i = 0; i < 256; i++)

{

pts[0][i].x = i * 2 + 100;

pts[0][i].y = 550 - int(r[i] * (300.0 / (*Max_r)));//歸一化到[0, 300]

pts[1][i].x = i * 2 + 100;

pts[1][i].y = 550 - int(g[i] * (300.0 / (*Max_g)));//歸一化到[0, 300]

pts[2][i].x = i * 2 + 100;

pts[2][i].y = 550 - int(b[i] * (300.0 / (*Max_b)));//歸一化到[0, 300]//顯示橫坐標

if ((i + 1) % 16 == 0)

{string num = format("%d", i + 1);

putText(hist, num, Point(pts[0][i].x, 570), FONT_HERSHEY_SIMPLEX, 0.5, Scalar(255, 255, 255));

}

}//繪制線

for (int i = 1; i < 256; i++)

{

line(hist, pts[0][i - 1], pts[0][i], Scalar(255, 0, 0), 2);

line(hist, pts[1][i - 1], pts[1][i], Scalar(0, 255, 0), 2);

line(hist, pts[2][i - 1], pts[2][i], Scalar(0, 0, 255), 2);

}//顯示圖像

imshow("直方圖", hist);

}//灰度直方圖計算

void calHist(const stringimg)

{

Mat src, grey;//讀取圖象

src =imread(img);if (!src.data)

{

cout<< "Image:" + img + "讀取失敗" <

}//先轉為灰度圖

cvtColor(src, grey, COLOR_BGR2GRAY);

imshow("灰度圖", grey);//計算各灰度級像素個數

vector nums(256);for (int i = 0; i < grey.rows; i++)

{

uchar* p = grey.ptr(i);for (int j = 0; j < grey.cols; j++)

{

nums[p[j]]++;

}

}

drawHist(nums);

}//多通道直方圖計算

void calHist(const string img, intpattern)

{

Mat src, grey;//讀取圖象

src =imread(img);if (!src.data)

{

cout<< "Image:" + img + "讀取失敗" <

}

imshow("原圖像",src);//計算各灰度級像素個數

vector r(256, 0);

vector g(256, 0);

vector b(256, 0);for (int i = 0; i < src.rows; i++)

{

uchar* p = src.ptr(i);for (int j = 0; j < src.cols; j++)

{

r[p[j* 3 + 0]]++;

g[p[j* 3 + 1]]++;

b[p[j* 3 + 2]]++;

}

}

drawHist(r, g, b);

}intmain()

{string img = "D:\\trashBox\\testIMG\\tiger.jpg";

calHist(img);//計算灰度直方圖

calHist(img, 0);//計算三色直方圖

waitKey(0);return 0;

}

總結

以上是生活随笔為你收集整理的opencv 绘制坐标曲线_OpenCV手工实现灰度及RGB直方图的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。