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);//居中显示
}