Artefacts while copying pixelvalues

asked 2014-04-12 14:03:34 -0500

Brixus gravatar image

Hi everybody, I would like to blend pictures manually using a loop. In detail I want to copy the white pixels from a binary image (0==black, 255==white, not other values possible) to a new Picture which is at the beginning a Mat just including black pixels.

My code works fine if I use a Mat created with white pixels. But if I use my binary images I load into OpenCV I get artefacts. I cannot understand why this is happening. If I look in the source image in OpenCV the pixels have just 0 or 255, but if I vary with the thresholdvalue I get different Artefacts.

Normaly intensity >=1 should work well, but If I use for example 100 I get still differend artefacts.

This is the code I use:

#include <opencv2/highgui/highgui.hpp>
#include <iostream>

using namespace std;
using namespace cv;

void Vblend(Mat src, Mat blend)
 {   int colu, row;
     int intensity;
     for (row=0; row<=480; row++)
     {
         for (colu=0; colu<=640; colu++)
         {
             intensity = src.at<uchar>(row, colu);
             if(intensity >=1) {blend.at<uchar>(row, colu)=255;}
         }
     }
 }


int main()
{
   Mat src= imread("pic.jpg",CV_LOAD_IMAGE_GRAYSCALE);
   Mat blend(480,640,CV_8UC1,Scalar(0));

    namedWindow("src");
    namedWindow("blend");

   Vblend(src,blend);

   imshow("src", src);
   imshow("blend",blend);
   while(char(waitKey(1)) != 'q') {}
   return 0;
}

In this picture you can see the original on the left and the artefacts on the right.

blend.PNG

How can I eliminate the artefacts?

Thank you very much for your help :-)

edit retag flag offensive close merge delete

Comments

you're setting the blend pixel for anything > 1, maybe you need a higher threshold level than 1.

also, your whole function could be as short as :

Mat blend = img > 30;

and look at threshold() .

berak gravatar imageberak ( 2014-04-12 14:26:44 -0500 )edit