的特定區域我想只計算該圖像的小插曲區域,像我有圖像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