我已经实现了径向小插图,这是我的代码
void Vignette(const Mat&img, Mat &out, jint sigma) {
Mat a, b, c, d, f;
//double sigma = 280; // vignette 'aperture', the param to play with
a = getGaussianKernel(img.cols, sigma, CV_32F);
b = getGaussianKernel(img.rows, sigma, CV_32F);
c = b * a.t();
double minVal;
double maxVal;
minMaxLoc(c, &minVal, &maxVal);
d = c / maxVal;
d.convertTo(d, CV_8UC4, 255);
cvtColor(d, d, COLOR_GRAY2RGBA);
d.convertTo(d, CV_32F, 1.0 / 255);
multiply(img, d, out, 1, CV_8UC4);
}
现在我想在OpenCV中实现矩形小插图效果,请帮助我。提前谢谢。
答案 0 :(得分:1)
我按照这些步骤手动实现了方形小插图。 1.创造一个黑色和中心白色的正方形。
void generateSquareMask(Mat& temp1, int rowPercent, int colPercent, int r,
int g, int b) {
cvtColor(temp1, temp1, CV_BGRA2RGB);
for (int i = 0; i < temp1.rows; ++i) {
for (int j = 0; j < temp1.cols; ++j) {
if (i < (int) (rowPercent / 2)
|| i > ((int) (temp1.rows - (rowPercent) / 2))
|| j < (int) (colPercent / 2)
|| ((int) temp1.cols - j) < (int) (colPercent / 2)) {
temp1.at < cv::Vec3b > (i, j)[0] = b;
temp1.at < cv::Vec3b > (i, j)[1] = g;
temp1.at < cv::Vec3b > (i, j)[2] = r;
} else {
temp1.at < cv::Vec3b > (i, j)[0] = 255;
temp1.at < cv::Vec3b > (i, j)[1] = 255;
temp1.at < cv::Vec3b > (i, j)[2] = 255;
}
}
}
cvtColor(temp1, temp1, CV_RGB2RGBA);
blur(temp1, temp1, Size(((int) colPercent / 2), ((int) colPercent / 2)));
}
1。与原始图像相乘。
void square_Vignette(const Mat&img, Mat &out, jint sigma, int r, int g, int b) {
float cols = img.cols;
float rows = img.rows;
float temper = ((float) sigma) / 100;
float colPercent = cols * temper;
float rowPercent = rows * temper;
Mat temp1(img.size(), img.type());
generateSquareMask(temp1, ((int) rowPercent), ((int) colPercent), r, g, b);
temp1.convertTo(temp1, CV_32F, 1.0 / 255);
multiply(img, temp1, out, 1, CV_8UC4);
}