我從黑色cv::Mat
影像開始,但我想在其中添加 HSV。我該如何做到這一點?
int RE_START = -2;
int RE_END = 1;
int IM_START = -1;
int IM_END = 1;
int MAX_ITER = 80;
int mandelbrot(std::complex<double> c){
std::complex<double> z{0,0};
int n = 0;
while (abs(z) <= 2 && n < MAX_ITER){
z = z*z c;
n = 1;
}
return n;
}
int m;
int main()
{
//! [mandelbrot-transformation]
Mat mandelbrotImg(width, height,CV_8UC3, cv::Scalar(0, 0, 0));
Mat mandelHSV(width, height,COLOR_BGR2HSV);
float wid = (float)width;
float hei = (float)height;
int count = 0;
for (int x=0; x < width; x ){
for (int y=0; y<height; y ){
std::complex<double> c( RE_START (x / wid) * (RE_END - RE_START),
IM_START (y / hei) * (IM_END - IM_START));
m = mandelbrot(c);
double hue = (255 * m / (float)MAX_ITER);
double saturation = 255.0;
double value;
if (m < MAX_ITER) {
value = 255;
}else {
value = 0;
}
mandelbrotImg.at<cv::Vec3b>(x,y) = ((uchar)hue, (uchar)saturation, (uchar)value);
count ;
}
}
cv::cvtColor(mandelbrotImg, mandelbrotImg, COLOR_BGR2HSV);
imwrite("../img/mandle.png", mandelbrotImg);
}
};
這就是我到目前為止所擁有的!我不知道是否需要轉換它或在像素位置分配 HSV 值。
- 我添加了浮點除法
- 我已將 norm(z) 添加到 mandelbrot
影像輸出現在是:
預期輸出:
uj5u.com熱心網友回復:
您的原始代碼中存在許多問題,而您當前的代碼中仍然存在很多問題。
列舉一些:
cv::Mat
建構式首先期望高度,然后是寬度。cv::Mat::at
方法首先需要 y 坐標,然后是 x。- 最終的顏色轉換應該
COLOR_HSV2BGR
不是COLOR_BGR2HSV
。 mandelbrot
應該更好地接受引數const&
以避免復制(效率問題)。- 與其檢查
abs(z) <= 2
,不如使用它,norm(z) <= 4
因為它避免了計算 sqrt (效率問題)。 - 由于您的主要計算在
double
s 中,因此我將所有 s 交換float
為double
s。 - 沒有必要
cv::Mat
在構造時將 初始化為零值,因為稍后我們無論如何都會填充所有像素值。
見固定版本:
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <complex>
static const int RE_START = -2;
static const int RE_END = 1;
static const int IM_START = -1;
static const int IM_END = 1;
static const int MAX_ITER = 80;
int mandelbrot(std::complex<double> const & c)
{
std::complex<double> z{ 0,0 };
int n = 0;
while (std::norm(z) <= 4 && n < MAX_ITER)
{
z = z*z c;
n = 1;
}
return n;
}
int main()
{
int width = 960;
int height = 640;
cv::Mat mandelbrotImg(height, width, CV_8UC3);
double wid = (double)width;
double hei = (double)height;
double reWidth = RE_END - RE_START;
double imWidth = IM_END - IM_START;
for (int x = 0; x < width; x )
{
for (int y = 0; y < height; y )
{
std::complex<double> c(RE_START (x / wid) * reWidth, IM_START (y / hei) * imWidth);
int m = mandelbrot(c);
double hue = (255 * m / (float)MAX_ITER);
double saturation = 255.0;
double value = (m < MAX_ITER) ? 255.0 : 0;
mandelbrotImg.at<cv::Vec3b>(y, x) = cv::Vec3b((uchar)hue, (uchar)saturation, (uchar)value);
}
}
cv::cvtColor(mandelbrotImg, mandelbrotImg, cv::COLOR_HSV2BGR);
cv::imwrite("../img/mandle.png", mandelbrotImg);
}
輸出:
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/506607.html
上一篇:IRv6的支持已從產品中洗掉