QT:点击按钮实现不同的图像操作代码

qttest.h文件

#ifndef QTTEST_H
#define QTTEST_H

#include <QtGui/QMainWindow>
#include "ui_qttest.h"
class QAction;
class qttest : public QMainWindow
{
	Q_OBJECT

public:
	qttest(QWidget *parent = 0, Qt::WFlags flags = 0);
	~qttest();
    private slots://定义私有的槽函数
		void openImage();//打开图像
		void otsu();//实现otsu
		void recover();//恢复图像
		void threshold2();//二值化
		void decolor();//减色处理
		void averagepooling();//平均池化
		void maxpooling();//最大池化
		void gaussianBlur();//高斯滤波
		void channel_change();//通道转换
		void Setfont();//字体设置
private:
	Ui::qttestClass ui;
	QAction *openAction;
};

#endif

qttest.cpp文件

#include "qttest.h"
#include "ui_qttest.h"
#include <QFile>
#include <QDir>
#include <QFileDialog>
#include <QString>
#include <QStringList>
#include <QTextStream>
#include <QDebug>
#include <iostream>
#include <opencv\cv.h>
#include <opencv2\highgui\highgui.hpp>
#include <QMessageBox>
#include <QtGui/QAction> 
#include <QtGui/QMenu> 
#include <QtGui/QMenuBar> 
#include <QtGui/QKeySequence> 
#include <QtGui/QToolBar>
using namespace std;
using namespace cv;
extern int mark = 0;//全局变量,用作标志位
Mat dstImage;
qttest::qttest(QWidget *parent, Qt::WFlags flags): QMainWindow(parent, flags)
{
	ui.setupUi(this);
	connect(ui.btn_openimage, SIGNAL(clicked()),this, SLOT(openImage()));//信号与槽(鼠标点击与openImage)
	connect(ui.btn_otsu,SIGNAL(clicked()),this,SLOT(otsu()));//信号与槽(鼠标点击与otsu)
	connect(ui.btn_recover,SIGNAL(clicked()),this,SLOT(recover()));//信号与槽(鼠标点击与recover)
	connect(ui.btn_threshold,SIGNAL(clicked()),this,SLOT(threshold2()));//信号与槽(鼠标点击与threshold2)
	connect(ui.btn_decolor,SIGNAL(clicked()),this,SLOT(decolor()));//信号与槽(鼠标点击与decolor)
	connect(ui.btn_average_pooling,SIGNAL(clicked()),this,SLOT(averagepooling()));//信号与槽(鼠标点击与average_pooling)
	connect(ui.btn_max_pooling,SIGNAL(clicked()),this,SLOT(maxpooling()));//信号与槽(鼠标点击与max_pooling)
	connect(ui.btn_gaussianBlur,SIGNAL(clicked()),this,SLOT(gaussianBlur()));//信号与槽(鼠标点击与gaussianBlur)
	connect(ui.btn_channel_change,SIGNAL(clicked()),this,SLOT(channel_change()));//信号与槽(鼠标点击与channel_change)
	openAction = new QAction(tr("&Open"), this); //构造菜单动作
    openAction->setShortcut(QKeySequence::Open); 
	openAction->setShortcut(tr("Ctrl+0"));//自定义快捷键
    openAction->setStatusTip(tr("So far, Open has no function!")); 
    QMenu *file = menuBar()->addMenu(tr("&Menu")); //定义菜单栏
    file->addAction(openAction); //添加菜单
	connect(openAction, SIGNAL(triggered()),this, SLOT(openImage()));//信号与槽(动作激活与openImage)
}
qttest::~qttest(){}

int OTSU(const Mat srcImage);//获取otsu阈值
Mat QImage2cvMat(QImage image);//QImage转Mat
Mat decline_color(Mat img);//减色处理
Mat average_pooling(Mat img);//平均池化
Mat max_pooling(Mat img);//最大池化
Mat Channel_swap(Mat img);//通道转换
void Setfont();//字体设置
void qttest::channel_change()
{
	if(mark==0)
		Setfont();
	else
	{
		Mat img=dstImage;
		img=Channel_swap(img);
		QImage pImage;
		pImage=QImage((const unsigned char*)img.data,img.cols,img.rows,QImage::Format_RGB888);
		pImage = pImage.scaled(ui.lb_displayimage->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
		ui.lb_displayimage->setPixmap(QPixmap::fromImage(pImage));
	}
}
void qttest::gaussianBlur()
{
	if(mark==0)
		Setfont();
	else
	{
		Mat img=dstImage;
		Mat out;
		GaussianBlur(img, out, Size(5, 5), 3, 3);
		//GaussianBlur(out, out, Size(5, 5), 3, 3);
		QImage pImage;
		pImage=QImage((const unsigned char*)out.data,out.cols,out.rows,QImage::Format_RGB888);
		pImage = pImage.scaled(ui.lb_displayimage->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
		ui.lb_displayimage->setPixmap(QPixmap::fromImage(pImage));
	}
}
void qttest::maxpooling()
{
	if(mark==0)
		Setfont();
	else
	{
		Mat img=dstImage;
		img=max_pooling(img);
		QImage pImage;
		pImage=QImage((const unsigned char*)img.data,img.cols,img.rows,QImage::Format_RGB888);
		pImage = pImage.scaled(ui.lb_displayimage->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
		ui.lb_displayimage->setPixmap(QPixmap::fromImage(pImage));
	}
}
void qttest::averagepooling()
{
	if(mark==0)
		Setfont();
	else
	{
		Mat img=dstImage;
		img=average_pooling(img);
		QImage pImage;
		pImage=QImage((const unsigned char*)img.data,img.cols,img.rows,QImage::Format_RGB888);
		pImage = pImage.scaled(ui.lb_displayimage->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
		ui.lb_displayimage->setPixmap(QPixmap::fromImage(pImage));
	}
}
void qttest::decolor()
{
	if(mark==0)
		Setfont();
	else
	{
		Mat img=dstImage;
		img=decline_color(img);
		QImage pImage;
		pImage=QImage((const unsigned char*)img.data,img.cols,img.rows,QImage::Format_RGB888);
		pImage = pImage.scaled(ui.lb_displayimage->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
		ui.lb_displayimage->setPixmap(QPixmap::fromImage(pImage));
	}
}
void qttest::threshold2()
{
	if(mark==0)
		Setfont();
	else
	{
		Mat img=dstImage;
		cvtColor(img,img,CV_RGB2GRAY);
		QImage pImage;
		pImage=QImage((const unsigned char*)img.data,img.cols,img.rows,QImage::Format_Indexed8);
		pImage = pImage.scaled(ui.lb_displayimage->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
		ui.lb_displayimage->setPixmap(QPixmap::fromImage(pImage));
	}
}
void qttest::recover()
{
	if(mark==0)
		Setfont();
	else
	{
		QImage pImage;
		pImage=QImage((const unsigned char*)dstImage.data,dstImage.cols,dstImage.rows,QImage::Format_RGB888);
		pImage = pImage.scaled(ui.lb_displayimage->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
		ui.lb_displayimage->setPixmap(QPixmap::fromImage(pImage));	
	}
}
void qttest::otsu()
{
	if(mark==0)
		Setfont();
	else
	{
		Mat img;
		cvtColor(dstImage,img,CV_RGB2GRAY);
		int thresholdValue=OTSU(img);
		qDebug()<<thresholdValue;
		threshold(img,img,thresholdValue,255,THRESH_BINARY);
		QImage pImage;
		pImage=QImage((const unsigned char*)img.data,img.cols,img.rows,QImage::Format_Indexed8);
		pImage = pImage.scaled(ui.lb_displayimage->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
		ui.lb_displayimage->setPixmap(QPixmap::fromImage(pImage));
	}
}
void qttest::openImage()
{
	QString pFileName;
	pFileName=QFileDialog::getOpenFileName(0,QString::fromLocal8Bit("请选择图像:"),QString::fromLocal8Bit("F:\\vs2010test\\test1\\test1\\"),QString::fromLocal8Bit("Images (*.png *.bmp *.jpg *.tif *.GIF )"));
	Mat srcImage,grayImage;
	char*  pChar;
	QByteArray pByteArray = pFileName.toLatin1();    
	pChar=pByteArray.data();
	Mat image=imread(pChar,IMREAD_COLOR);
	dstImage=Channel_swap(image);
	QImage pImage;
	pImage=QImage((const unsigned char*)dstImage.data,dstImage.cols,dstImage.rows,QImage::Format_RGB888);
	pImage = pImage.scaled(ui.lb_displayimage->size(),Qt::KeepAspectRatio,Qt::SmoothTransformation);
	ui.lb_displayimage->setPixmap(QPixmap::fromImage(pImage));
	mark = 1;
}
int OTSU(Mat srcImage) 
{
	int nCols = srcImage.cols;
	int nRows = srcImage.rows;
	int threShold = 0;
	int nSumPix[256];
	float nProDis[256];
	for (int i = 0; i < 256; i++)
	{
		nSumPix[i] = 0;
		nProDis[i] = 0;
	}
	for (int i = 0; i < nRows; i++)
	{
		for (int j = 0; j < nCols; j++)
		{
			nSumPix[(int)srcImage.at<uchar>(i, j)]++;
		}
	}
	for (int i = 0; i < 256; i++)
	{
		nProDis[i] = (float)nSumPix[i] / (nCols*nRows);
	}
	float w0, w1, u0_temp, u1_temp, u0, u1, delta_temp;
	double delta_max = 0.0;
	for (int i = 0; i < 256; i++)
	{
		w0 = w1 = u0 = u1 = u0_temp = u1_temp = delta_temp = 0;
		for (int j = 0; j < 256; j++)
		{
			if (j <= i)
			{
				w0 += nProDis[j];
				u0_temp += j*nProDis[j];
			}
			else
			{
				w1 += nProDis[j];
				u1_temp += j*nProDis[j];
			}
		}
		u0 = u0_temp / w0;
		u1 = u1_temp / w1;
		delta_temp = (float)(w0*w1*pow((u0 - u1), 2)); //前景与背景之间的方差(类间方差)
		if (delta_temp > delta_max)
		{
			delta_max = delta_temp;
			threShold = i;
		}
	}
	return threShold;
}
Mat decline_color(Mat img){
	int imgrow = img.rows;
	int imgcol = img.cols;
	int channel=img.channels();
	Mat de_color = Mat::zeros(imgrow,imgcol,CV_8UC3);
	for(int j=0;j<imgrow;j++){
		for(int i=0;i<imgcol;i++){
			for(int k=0;k<channel;k++){
				de_color.at<Vec3b>(j,i)[k] = (uchar)(floor((double)(img.at<Vec3b>(j,i)[k])/64)*64+32);
			}
		}
	}
	return de_color;
}
Mat average_pooling(Mat img){
	int imgrow = img.rows;
	int imgcol = img.cols;
	int channel = img.channels();
	Mat out = Mat::zeros(imgrow,imgcol,CV_8UC3);
	int step = 5;
	double grid_sum;
	for(int j=0;j<imgrow;j+=step){        //行
		for(int i=0;i<imgcol;i+=step){     //列
			for(int k=0;k<channel;k++){     //通道
				grid_sum=0;
				for(int j_=0;j_<step;j_++){
					for(int i_=0;i_<step;i_++){
						grid_sum += (double)img.at<Vec3b>(j+j_,i+i_)[k];
					}
				}
				grid_sum /= (step*step);
				for(int j_=0;j_<step;j_++){
					for(int i_=0;i_<step;i_++){
						out.at<Vec3b>(j+j_,i+i_)[k] = (uchar)grid_sum;
					}
				}
			}
		}
	}
	return out;
}
Mat max_pooling(Mat img){
	int imgrow = img.rows;
	int imgcol = img.cols;
	int channel = img.channels();
	Mat out = Mat::zeros(imgrow,imgcol,CV_8UC3);
	int step = 5;
	double pixmax;
	for(int j=0;j<imgrow;j+=step){        //行
		for(int i=0;i<imgcol;i+=step){     //列
			for(int k=0;k<channel;k++){     //通道
				pixmax=0;
				for(int j_=0;j_<step;j_++){
					for(int i_=0;i_<step;i_++){
						if((double)img.at<Vec3b>(j+j_,i+i_)[k]>pixmax){
							pixmax = (double)img.at<Vec3b>(j+j_,i+i_)[k];
						}
					}
				}
				for(int j_=0;j_<step;j_++){
					for(int i_=0;i_<step;i_++){
						out.at<Vec3b>(j+j_,i+i_)[k] = (uchar)pixmax;
					}
				}
			}
		}
	}
	return out;
}
Mat Channel_swap(Mat img){
	int imgcol=img.cols;
	int imgrow=img.rows;
	Mat out_img=Mat::zeros(imgrow,imgcol,CV_8UC3);
	for(int j=0;j<imgrow;j++){
		for(int i=0;i<imgcol;i++){   //BGR,8U的彩色图像表示为Vec3b
			out_img.at<Vec3b>(j,i)[0] = img.at<Vec3b>(j,i)[2]; //R->B
			out_img.at<Vec3b>(j,i)[2] = img.at<Vec3b>(j,i)[0]; //B->R
			out_img.at<Vec3b>(j,i)[1] = img.at<Vec3b>(j,i)[1]; //G->G
		}
	}
	return out_img;
}
void qttest::Setfont()
{
	ui.lb_displayimage->setText("No Image,please click OpenImage");
	setStyleSheet("QLabel{color:red;font: bold 24px;}");//颜色与大小
	ui.lb_displayimage->setAlignment(Qt::AlignCenter);//居中显示
}

猜你喜欢

转载自blog.csdn.net/yuan123890/article/details/108101410
今日推荐