#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QTime>
#include <QBuffer>
#include <QDebug>
#include <qstring.h>
#include <string>
#include <QSlider>
#include <QtCore/QVariant>
#include <QAction>
#include <QHeaderView>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
connect(ui->grayButton, SIGNAL(clicked()), this, SLOT(on_grayButton_clicked()));
connect(ui->filterButton, SIGNAL(clicked()), this, SLOT(on_filterButton_clicked()));
connect(ui->contourButton, SIGNAL(clicked()), this, SLOT(on_contourButton_clicked()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QFileDialog::Options options;
QString selectedFilter;
QString fileName = QFileDialog::getOpenFileName(this,
tr("Open Image Files"),
"",
tr("Image files (*.jpeg *.jpg *.png *.gif *.bmp)"),
&selectedFilter,
options);
if (!fileName.isEmpty()){
sourceimage = cv::imread(fileName.toStdString(),1);} //0 for grayscale,注意这里如果是0的话可能是打开灰度形式的
else
{
return;
}
sourceimage.copyTo(image1);
displayMat1(sourceimage);
}
void MainWindow::displayMat1(const cv::Mat& image)
{
//BGR openCV Mat to QImage
QImage img_qt = QImage((const unsigned char*)image.data,image.cols, image.rows, image.step, QImage::Format_RGB888);
//For Binary Images
if (img_qt.isNull()){
//ColorTable for Binary Images
QVector<QRgb> colorTable;
for (int i = 0; i < 256; i++)
colorTable.push_back(qRgb(i, i, i));
img_qt = QImage((const unsigned char*)image.data,image.cols, image.rows, QImage::Format_RGB888);// QImage::Format_Indexed8
img_qt.setColorTable(colorTable);
}
//Display the QImage in the Label
QPixmap img_pix = QPixmap::fromImage(img_qt.rgbSwapped()); // RGB to BGR 然后用QPixmap对象获取图像
ui->label->resize(img_pix.size());
ui->label->setPixmap(img_pix.scaled(ui->label->size(), Qt::KeepAspectRatio));
//ui->label_12->resize(ui->label_12->pixmap()->size());
//this->ui->label_12->setPixmap(img_pix);
}
void MainWindow::on_pushButton_2_clicked()//转换成HSI图像并分离
{
src = cvCloneImage(&(IplImage)sourceimage);//原图像转换成 IplImage *src
copyimg= cvCreateImage(cvGetSize(src),8,3); //建立一个图像 8位3通道
cvCopy(src,copyimg,NULL); //将原图拷贝一份
hsi = cvCreateImage(cvGetSize(src),8,3);
h_plane = cvCreateImage(cvGetSize(src),8,1);
s_plane = cvCreateImage(cvGetSize(src),8,1);
i_plane = cvCreateImage(cvGetSize(src),8,1);
cvCvtColor( copyimg, hsi, CV_BGR2HSV );//将RGB转换成HSI空间
cvSplit(hsi,h_plane,s_plane,i_plane, NULL);//将HSI图像分解成三个分量
cvNamedWindow( "1", CV_WINDOW_AUTOSIZE );
cvShowImage("1",hsi);
cvNamedWindow( "2", CV_WINDOW_AUTOSIZE );
cvShowImage("2",h_plane);
cvNamedWindow( "3", CV_WINDOW_AUTOSIZE );
cvShowImage("3",s_plane);
cvNamedWindow( "4", CV_WINDOW_AUTOSIZE );
cvShowImage("4",i_plane);
}
void MainWindow::on_grayButton_clicked()
{
src = cvCloneImage(&(IplImage)sourceimage);
IplImage *img1 = cvCreateImage(cvGetSize(src),8,1);
cvCvtColor(src,img1,CV_BGR2GRAY);//灰度化
cvNamedWindow( "1", CV_WINDOW_AUTOSIZE );
cvShowImage("1",img1);
}
void MainWindow::on_filterButton_clicked()
{
src = cvCloneImage(&(IplImage)sourceimage);
IplImage *img2 = cvCreateImage(cvGetSize(src),8,3);
cvSmooth(src,img2,CV_MEDIAN,5,3);//均值滤波
cvNamedWindow( "1", CV_WINDOW_AUTOSIZE );
cvShowImage("1",img2);
}
void MainWindow::on_contourButton_clicked()
{
src = cvCloneImage(&(IplImage)sourceimage);
height=src->height;
width=src->width;
size = height * width;
//histogram
float histogram[256]={0};
for( m=0; m < height; m++)
{
unsigned char* p=(unsigned char*)src->imageData + src->widthStep * m;
for(0; n < width; n++)
{
histogram[int(*p++)]++;
}
}
sum0 = 0; sum1 = 0; //存储前景的灰度总和和背景灰度总和
cnt0 = 0; cnt1 = 0; //前景的总个数和背景的总个数
w0 = 0; w1 = 0; //前景和背景所占整幅图像的比例
u0 = 0; u1 = 0; //前景和背景的平均灰度
variance = 0; //最大类间方差
u = 0;
maxVariance = 0;
for(i = 1; i < 256; i++) //一次遍历每个像素
{
sum0 = 0;
sum1 = 0;
cnt0 = 0;
cnt1 = 0;
w0 = 0;
w1 = 0;
for(j = 0; j < i; j++)
{
cnt0 += histogram[j];
sum0 += j * histogram[j];
}
u0 = (double)sum0 / cnt0;
w0 = (double)cnt0 / size;
for(j = i ; j <= 255; j++)
{
cnt1 += histogram[j];
sum1 += j * histogram[j];
}
u1 = (double)sum1 / cnt1;
w1 = 1 - w0; // (double)cnt1 / size;
u = u0 * w0 + u1 * w1; //图像的平均灰度
printf("u = %f\n", u);
//variance = w0 * pow((u0 - u), 2) + w1 * pow((u1 - u), 2);
variance = w0 * w1 * (u0 - u1) * (u0 - u1);
if(variance > maxVariance)
{
maxVariance = variance;
threshold = i;
}
}
printf("threshold = %d\n", threshold);
cvThreshold(src, dst, threshold, 255, CV_THRESH_BINARY);
cvNamedWindow( "src", 1 );
cvShowImage("src", dst);
cvWaitKey(-1);
cvReleaseImage(&src);
cvReleaseImage(&dst);
cvDestroyWindow( "dst" );
return 0;
}