的特定区域我想只计算该图像的小插曲区域,像我有图像here如何提取图像
我怎么可以算或迭代/只在应用暗角区域通过,离开其他地区?我只想在应用晕影的区域应用该算法,我尝试了这种方法,就像给红色的标量并提取发现红色的区域,但它不工作就像没有给出结果,因为当朝向中心时颜色变得更亮的形象。
的vignette由图像强度随以下掩码相乘变暗角落和边缘:
这是原始图像here
欲blending overlay
的**only vignette part of** vignette image
与original image
这里是我的代码混合覆盖
void blending_overlay(Mat& img1 , Mat& img2 , Mat& out)
{
Mat result(img1.size(), CV_32FC3);
for(int i = 0; i < img1.size().height; ++i){
for(int j = 0; j < img1.size().width; ++j){
for (int c=0 ; c<img1.channels();c++){
float target = (float)img1.at<uchar>(i, 3*j+c)/255. ;
float blend = (float)img2.at<uchar>(i, 3*j+c)/255. ;
if(target > 0.5){
result.at<float>(i, 3*j+c) = ((1 - (1-2*(target-0.5)) * (1-blend)));
}
else{
result.at<float>(i, 3*j+c) = ((2*target) * blend);
}
}
}
}
result.convertTo(out,CV_8UC3,255);
}
int main(int argc, char** argv)
{
Mat Img1=imread("D:\\Vig.png",-1); // the vignete in the question
Mat Img2=imread("D:\\i.png"); // the iamge in the question
cv::resize(Img1,Img1,Img2.size());
Img1.convertTo(Img1,CV_32FC4,1.0/255.0);
Img2.convertTo(Img2,CV_32FC3,1.0/255.0);
vector<Mat> ch;
split(Img1,ch);
Mat mask = ch[3].clone(); // here's the vignette
ch.resize(3);
Mat I1,I2,result;
cv::multiply(mask,ch[0],ch[0]);
cv::multiply(mask,ch[1],ch[1]);
cv::multiply(mask,ch[2],ch[2]);
merge(ch,I1);
vector<Mat> ch2(3);
split(Img2, ch2);
cv::multiply(1.0-mask,ch2[0],ch2[0]);
cv::multiply(1.0-mask,ch2[1],ch2[1]);
cv::multiply(1.0-mask,ch2[2],ch2[2]);
merge(ch2,I2);
I1.convertTo(I1,CV_8UC3,255);
I2.convertTo(I2,CV_8UC3,255);
result=I1+I2; // The image with the vignette in the question
result.convertTo(result,CV_8UC4,255);
Mat result2;
Mat mask2;
Mat image = imread ("D:\\i.png"); // image in the question
blending_overlay(image,result,result2,mask2);
imshow("Image",result2);
waitKey(0);
}
它适用于与原始图像混合小品形象,但我只想与原来的图像混合的暗角部分来自小插曲图像
我得到的结果是this
你能简单地提取想要的图像部分,过程,然后将这些像素复制回原来的形象呢?另外,请原谅我的无知,但什么是小插曲**? – rayryeng
这是小插曲http://www.lifeclever.com/wp-content/uploads/2007/01/vignette_edge_no_image.jpg – AHF
我想应用小插曲后的图像部分 – AHF