2013-05-12 2 views
2

Я пытаюсь загрузить изображение BGR и копировать некоторые пиксели, которые подтверждают какое-либо условие для нового изображения, которое я создал с использованием загруженных изображений ширины, высоты и типа. Тип CV_8UC3.Opencv Mat create Image

Mat initial_Image = imread("image.jpg"); 
Mat image(img.rows,img.cols, CV_8UC3); 

cout<<initial_Image.type()<<endl; 

for(int i = 0;i < img.cols ;i++) 
{ 
for(int j = 0;j < img.rows ;j++) 
{ 
Vec3b intensity = initial_Image.at<Vec3b>(j,i); 
uchar blue = intensity.val[0]; 
uchar green = intensity.val[1]; 
uchar red = intensity.val[2]; 


image.at<uchar>(j,i) = blue; 
image.at<uchar>(j+1,i+1) = green; 
image.at<uchar>(j+2,i+2) = red ; 

    } 
} 
out.close(); 

imshow("im", image); 

Я не поставил условие, но я просто попытался скопировать все соответствующие пиксели из прочитанного изображения в новое созданное изображение.

Моя проблема в том, что прочитанное изображение представляет собой 3 канала RGB, но когда я рисую изображение, скопировав пиксель в новое созданное изображение, оно дает мне черно-белое изображение, которое делится на 3. ПОЧЕМУ? Поскольку я должен изменить значения пикселей, как только я получу эту работу на основе некоторых условий, я не могу использовать функцию copyto, как могут предположить некоторые. Причина, по которой я ставил условие, - это облегчить работу по исправлению. Спасибо.

ответ

4

То, как вы индексируете image, является неправильным. Текущий способ индексирования image будет писать blue для индекса j,i, а затем, когда вы достигнете следующего столбца, синий пиксель будет записан в j+1,i+1, фактически перезаписав зеленое значение. Вместо этого вы должны индексировать image, используя .at<Vec3b>.

Проще всего было бы сделать это следующим образом:

image.at<Vec3b>(j,i) = initial_Image.at<Vec3b>(j,i); 

Если вы хотите изменить redblue, и green вы могли бы сделать это следующим образом:

Vec3b intensity = initial_Image.at<Vec3b>(j,i); 
uchar blue = intensity.val[0]; 
uchar green = intensity.val[1]; 
uchar red = intensity.val[2]; 

//Do stuff with blue, green, and red 

image.at<Vec3b>(j,i) = Vec3b(blue,green,red);