您的位置:首页 > 编程语言 > Qt开发

linux下基于QT openCV的图像处理

2014-12-01 20:15 746 查看
linux下首先实现打开一个图片

然后对图片进行加椒盐噪声,滤波,边缘检测等处理

下面看实验的具体步骤:

首先看看实验的总体效果:



实验主要包括以上各种算法对图像的处理,下面看具体的步骤:

对图像进行椒盐处理:

代码如下:

void Widget::salt(cv::Mat &image, int n)

{

int i,j;

for (int k=0; k<n; k++)

{

i= qrand()%image.cols;

j= qrand()%image.rows;

if (image.channels() == 1)

{ // gray-level image

image.at<uchar>(j,i)= 255;

}

else if (image.channels() == 3)

{ // color image

image.at<cv::Vec3b>(j,i)[0]= 255;

image.at<cv::Vec3b>(j,i)[1]= 255;

image.at<cv::Vec3b>(j,i)[2]= 255;

}

}

}


对图像色域变化,简单的说就是把图像的色域调整比如说把256*256*256的图像变化为128*128*128的图像,处理的代码如下:

void Widget::colorReduce0(cv::Mat &image, int div)

{

int nl= image.rows; // number of lines

int nc= image.cols * image.channels(); // total number of elements per line

for (int j=0; j<nl; j++)

{

uchar* data= image.ptr<uchar>(j);

for (int i=0; i<nc; i++)

{

// process each pixel ---------------------

data[i]= data[i]/div*div+div/2;

// end of pixel processing ----------------

} // end of line

}

}

效果如下:



图像的灰度化出处理:把三通道的图像处理为,单通道的灰度化的图像

效果如下:



图像的边缘检测:实验的原理就是检测图像像素间的灰度变化率,当灰度的变化过快时,可能就是边缘点;;

使用canny算子检测的代码如下:

Mat gray;

Mat frame_canny_1;

cvtColor(image,gray,CV_BGR2GRAY);

Canny(gray,frame_canny_1,150,100,3);

Canny(gray,frame_canny_1,20,75,3);

imshow("【效果图】Canny边缘检测",frame_canny_1 );



使用梯度算子检测的代码如下:

void Widget::lvbo(cv::Mat &image)

{

Mat grad_x, grad_y;

Mat abs_grad_x, abs_grad_y,dst;

Scharr( image, grad_x, CV_16S, 1, 0, 1, 0, BORDER_DEFAULT );

convertScaleAbs( grad_x, abs_grad_x );

imshow("【效果图】 X方向Scharr", abs_grad_x);

Scharr( image, grad_y, CV_16S, 0, 1, 1, 0, BORDER_DEFAULT );

convertScaleAbs( grad_y, abs_grad_y );

imshow("【效果图】Y方向Scharr", abs_grad_y);

addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst );

imshow("【效果图】合并梯度后Scharr", dst);

}

通过合成X,Y方向的梯度算子得到整体的效果如下:



通过高斯滤波后去噪处理后通过laplacian算子边缘检测的代码如下:

void Widget::laps(cv::Mat &image)

{

Mat src,src_gray,dst, abs_dst;

GaussianBlur( image, src, Size(3,3), 0, 0, BORDER_DEFAULT );//高斯滤波

cvtColor( src, src_gray, CV_RGB2GRAY );

Laplacian( src_gray, dst, CV_16S, 3, 1, 0, BORDER_DEFAULT );

convertScaleAbs( dst, abs_dst );

imshow("【效果图】Laplacian边缘检测",abs_dst );

}

效果图如下:



通过sobel算子边缘检测的代码如下:

void Widget::chafen(cv::Mat &image)

{

Mat grad_x, grad_y;

Mat abs_grad_x, abs_grad_y,dst;

Mat gray;

cvtColor(image,gray,CV_BGR2GRAY);

Sobel( gray, grad_x, CV_16S, 1, 0, 3, 1, 1, BORDER_DEFAULT );

convertScaleAbs( grad_x, abs_grad_x );

imshow("【效果图】 X方向Sobel", abs_grad_x);

Sobel( gray, grad_y, CV_16S, 0, 1, 3, 1, 1, BORDER_DEFAULT );

convertScaleAbs( grad_y, abs_grad_y );

imshow("【效果图】Y方向Sobel", abs_grad_y);

addWeighted( abs_grad_x, 0.5, abs_grad_y, 0.5, 0, dst );

imshow("【效果图】整体方向Sobel", dst);



效果图如下;





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: