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);
}
效果图如下;
然后对图片进行加椒盐噪声,滤波,边缘检测等处理
下面看实验的具体步骤:
首先看看实验的总体效果:
实验主要包括以上各种算法对图像的处理,下面看具体的步骤:
对图像进行椒盐处理:
代码如下:
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);
}
效果图如下;
相关文章推荐
- (GO_GTD_3)基于OpenCV和QT,建立Android图像处理程序
- 基于PI+QT实现OpenCV图像处理操作(基本环境搭建)
- windows平台下基于QT和OpenCV搭建图像处理平台
- (GO_GTD_1)基于OpenCV和QT,建立Android图像处理程序
- (GO_GTD_2)基于OpenCV和QT,建立Android图像处理程序
- 【图像处理】基于OpenCV底层实现的图片旋转
- Qt&OpenCV——Q图像处理基本操作
- OpenCV&Qt学习之三——图像的初步处理
- 基于Linux的opencv+QT开发环境搭建
- 基于OpenCV的CT图像处理
- linux中配置在qt中调用opencv图像库
- 基于Opencv图像处理的时时头像採集试验
- openCV基于图像处理的自动聚焦
- 基于MFC和OpenCV的图像处理小软件(续)
- 3_opencv2计算机视觉学习_基于类的图像处理
- 【图像处理】基于OpenCV底层实现的滤波
- 基于opencv和c++的图像处理:直方图匹配
- 图像处理之基础---基于opencv的灰度图像微分
- 在qt上OpenCV处理OV9650采集的图像
- OpenCV&Qt学习之三——图像的初步处理