Adding two image & changing the contrast and blightness & Basic Drawing

Adding (blending) two images using OpenCV

sscanf(argv[1],"%lf",&input);//将输入的char* 变换成double类型。

 

the function addWeighted comes quite handy:
beta = ( 1.0 - alpha );
addWeighted( src1, alpha, src2, beta, 0.0, dst);
since addWeighted produces:
dst = α · src1 + β · src2 + γ
In this case, γ is the argument 0.0 in the code above.

Mat src1,dst;

src1 = imread(argv[2],1);

imshow( "Linear Blend", dst );
#include <cv.h>
#include <highgui.h>
#include <iostream>
using namespace cv;
int main( int argc, char** argv )
{
double alpha = 0.5; double beta; double input;
Mat src1, src2, dst;
/// Ask the user enter alpha
/// We use the alpha provided by the user iff it is between 0 and 1
if( argc !=4 )
{
        std::cout<<"Usage: "<<argv[0]<<" alpha(0-1) pic1 pic2"<<std::endl;
        return -1;
}
sscanf(argv[1],"%lf",&input);
if( input >= 0 && input <= 1 ) //the original one in tutorials is incorrect
{ alpha = input; }
/// Read image ( same size, same type )
src1 = imread(argv[2],1);
src2 = imread(argv[3],1);
if( !src1.data ) { printf("Error loading src1 \n"); return -1; }
if( !src2.data ) { printf("Error loading src2 \n"); return -1; }
/// Create Windows
namedWindow("Linear Blend", 1);
beta = ( 1.0 - alpha );
addWeighted( src1, alpha, src2, beta, 0.0, dst);
imshow( "Linear Blend", dst );
waitKey(0);
return 0;
}

 

Changing the contrast(对比度) and brightness of an image!

 

Mat new_image = Mat::zeros( image.size(), image.type() );
We observe that Mat::zeros returns a Matlab-style zero initializer based on image.size() and image.type()

 

operating with RGB images,

for( int y = 0; y < image.rows; y++ )
{ for( int x = 0; x < image.cols; x++ )
{ for( int c = 0; c < 3; c++ )
{ new_image.at<Vec3b>(y,x)[c] =
saturate_cast<uchar>( alpha*( image.at<Vec3b>(y,x)[c] ) + beta ); }
}
}

 

  To access each pixel in the images we are using this syntax: image.at<Vec3b>(y,x)[c] where y is the row,
x is the column and c is R, G or B (0, 1 or 2).
• Since the operation α · p(i, j) + β can give values out of range or not integers (if α is float), we use
saturate_cast to make sure the values are valid.

Basic Drawing

/// Create black empty images
Mat atom_image = Mat::zeros( w, w, CV_8UC3 );
line( img,
start,
end,
Scalar( 0, 0, 0 ),
thickness,
lineType );

– Draw a line from Point start to Point end
– The line is displayed in the image img
– The line color is defined by Scalar( 0, 0, 0) which is the RGB value correspondent to Black
– The line thickness is set to thickness (in this case 2)
– The line is a 8-connected one (lineType = 8)

ellipse( img,
Point( w/2.0, w/2.0 ),
Size( w/4.0, w/16.0 ),
angle,
0,
360,
Scalar( 255, 0, 0 ),
thickness,
lineType );

– The ellipse is displayed in the image img
– The ellipse center is located in the point (w/2.0, w/2.0) and is enclosed in a box of size (w/4.0, w/16.0)
– The ellipse is rotated angle degrees
– The ellipse extends an arc between 0 and 360 degrees
– The color of the figure will be Scalar( 255, 255, 0) which means blue in RGB value.
– The ellipse’s thickness is 2.

circle( img,
center,
w/32.0,
Scalar( 0, 0, 255 ),
thickness,
lineType );

– The image where the circle will be displayed (img)
– The center of the circle denoted as the Point center
– The radius of the circle: w/32.0
– The color of the circle: Scalar(0, 0, 255) which means Red in BGR
– Since thickness = -1, the circle will be drawn filled.

/**
 * @function MyPolygon
 * @function Draw a simple concave polygon (rook)
 */
void MyPolygon( Mat img )
{
  int lineType = 8;

  /** Create some points */
  Point rook_points[1][20];
  rook_points[0][0]  = Point(    w/4,   7*w/8 );
  rook_points[0][1]  = Point(  3*w/4,   7*w/8 );
  rook_points[0][2]  = Point(  3*w/4,  13*w/16 );
  rook_points[0][3]  = Point( 11*w/16, 13*w/16 );
  rook_points[0][4]  = Point( 19*w/32,  3*w/8 );
  rook_points[0][5]  = Point(  3*w/4,   3*w/8 );
  rook_points[0][6]  = Point(  3*w/4,     w/8 );
  rook_points[0][7]  = Point( 26*w/40,    w/8 );
  rook_points[0][8]  = Point( 26*w/40,    w/4 );
  rook_points[0][9]  = Point( 22*w/40,    w/4 );
  rook_points[0][10] = Point( 22*w/40,    w/8 );
  rook_points[0][11] = Point( 18*w/40,    w/8 );
  rook_points[0][12] = Point( 18*w/40,    w/4 );
  rook_points[0][13] = Point( 14*w/40,    w/4 );
  rook_points[0][14] = Point( 14*w/40,    w/8 );
  rook_points[0][15] = Point(    w/4,     w/8 );
  rook_points[0][16] = Point(    w/4,   3*w/8 );
  rook_points[0][17] = Point( 13*w/32,  3*w/8 );
  rook_points[0][18] = Point(  5*w/16, 13*w/16 );
  rook_points[0][19] = Point(    w/4,  13*w/16 );

  const Point* ppt[1] = { rook_points[0] };
  int npt[] = { 20 };

  fillPoly( img,
        ppt,
        npt,
            1,
        Scalar( 255, 255, 255 ),
        lineType );
}

– The polygon will be drawn on img
– The vertices of the polygon are the set of points in ppt
– The total number of vertices to be drawn are npt
– The number of polygons to be drawn is only 1
– The color of the polygon is defined by Scalar( 255, 255, 255), which is the BGR value for white

rectangle( rook_image,
Point( 0, 7*w/8.0 ),
Point( w, w),
Scalar( 0, 255, 255 ),
-1,
8 );

– The rectangle will be drawn on rook_image
– Two opposite vertices of the rectangle are defined by ** Point( 0, 7*w/8.0 )** and Point( w, w)
– The color of the rectangle is given by Scalar(0, 255, 255) which is the BGR value for yellow
– Since the thickness value is given by -1, the rectangle will be filled.

posted @ 2013-01-23 23:27  Dervon  阅读(300)  评论(0)    收藏  举报