use*_*996 3 c++ opencv image-processing
我知道可以均衡图像的直方图,例如:
equalizeHist(image, image);
Run Code Online (Sandbox Code Playgroud)
如果我愿意,我可以定义一个ROI并在图像中仅对此ROI进行均衡:
Mat aux3 = image.clone();
equalizeHist(image(Rect(0,100, 200,200)), aux3(Rect(0,100, 200,200)));
Run Code Online (Sandbox Code Playgroud)
我现在想做的(并且我不知道是否可能)是使用点向量(cv :: vector轮廓)定义一个Roi(轮廓)并均衡该roi(这个roi并不总是会是一个矩形)
因此,这里的问题是:
使用openCV函数是否可以均衡不是矩形的图像部分?
OpenCV中没有内置功能可使用遮罩执行直方图均衡。您仍然可以编写自定义的。
获取灰度图像:
// Load image
Mat3b img = imread("path_to_image");
// Convert to grayscale
Mat1b gray;
cvtColor(img, gray, COLOR_BGR2GRAY);
Run Code Online (Sandbox Code Playgroud)
根据您的观点来做一个面具:
// 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));
Run Code Online (Sandbox Code Playgroud)
调用您的自定义函数equalizeHistWithMask,该函数使用遮罩使图像相等:
// Equalize with mask
Mat1b equalized;
equalizeHistWithMask(gray, equalized, mask);
Run Code Online (Sandbox Code Playgroud)
这里有功能的完整代码供参考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;
}
Run Code Online (Sandbox Code Playgroud)
学分
代码是基于此问题的Answers.opencv.org
| 归档时间: |
|
| 查看次数: |
1849 次 |
| 最近记录: |