gpt4 book ai didi

c++ - OpenCV,均衡图像轮廓直方图

转载 作者:太空狗 更新时间:2023-10-29 20:37:48 26 4
gpt4 key购买 nike

我知道可以均衡图像的直方图,例如:

equalizeHist(image, image);

如果我愿意,我可以定义一个 roi 并在图像中只均衡这个 roi:

Mat aux3 = image.clone();
equalizeHist(image(Rect(0,100, 200,200)), aux3(Rect(0,100, 200,200)));

我现在想做的(我不知道这是否可能)是使用点 vector (cv::vector contour) 定义一个 Roi(contour) 并均衡这个 roi (this roi并不总是矩形)

所以,这里的问题是:

是否可以使用 openCV 函数来均衡图像中不是矩形的部分?

最佳答案

OpenCV 中没有内置函数来执行带有掩码的直方图均衡化。您仍然可以编写自定义的。


获取灰度图像:

// Load image
Mat3b img = imread("path_to_image");

// Convert to grayscale
Mat1b gray;
cvtColor(img, gray, COLOR_BGR2GRAY);

enter image description here

根据您的观点形成掩码:

// Your vector of points
vector<Point> pts = { Point(300, 180), Point(450, 150), Point(600, 200), Point(650, 350), Point(300,300) };

// Create the mask
Mat1b mask(img.rows, img.cols, uchar(0));
vector<vector<Point>> ptsarray{pts};
fillPoly(mask, ptsarray, Scalar(255));

enter image description here

调用您的自定义函数 equalizeHistWithMask 以使用 mask 均衡图像:

// Equalize with mask
Mat1b equalized;
equalizeHistWithMask(gray, equalized, mask);

enter image description here

完整代码供引用,带有equalizeHistWithMask函数:

#include <iostream>
#include <vector>
#include <algorithm>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;

void equalizeHistWithMask(const Mat1b& src, Mat1b& dst, Mat1b mask = Mat1b())
{
int cnz = countNonZero(mask);
if (mask.empty() || ( cnz == src.rows*src.cols))
{
equalizeHist(src, dst);
return;
}

dst = src.clone();

// Histogram
vector<int> hist(256,0);
for (int r = 0; r < src.rows; ++r) {
for (int c = 0; c < src.cols; ++c) {
if (mask(r, c)) {
hist[src(r, c)]++;
}
}
}

// Cumulative histogram
float scale = 255.f / float(cnz);
vector<uchar> lut(256);
int sum = 0;
for (int i = 0; i < hist.size(); ++i) {
sum += hist[i];
lut[i] = saturate_cast<uchar>(sum * scale);
}

// Apply equalization
for (int r = 0; r < src.rows; ++r) {
for (int c = 0; c < src.cols; ++c) {
if (mask(r, c)) {
dst(r, c) = lut[src(r,c)];
}
}
}
}

int main()
{
// Load image
Mat3b img = imread("path_to_image");

// Convert to grayscale
Mat1b gray;
cvtColor(img, gray, COLOR_BGR2GRAY);

// Your vector of points
vector<Point> pts = { Point(300, 180), Point(450, 150), Point(600, 200), Point(650, 350), Point(300,300) };

// Create the mask
Mat1b mask(img.rows, img.cols, uchar(0));
vector<vector<Point>> ptsarray{pts};
fillPoly(mask, ptsarray, Scalar(255));

// Equalize with mask
Mat1b equalized;
equalizeHistWithMask(gray, equalized, mask);

imshow("Gray", gray);
imshow("Mask", mask);
imshow("Equalized", equalized);
waitKey();

return 0;
}

致谢

代码基于this answers.opencv.org 上的问题

关于c++ - OpenCV,均衡图像轮廓直方图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33691226/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com