实现了2种比值法计算云量

This commit is contained in:
2022-05-20 19:21:42 +08:00
parent 070b1f0572
commit 7adf9378ed
5 changed files with 588 additions and 0 deletions

194
cloudage.cpp Normal file
View File

@ -0,0 +1,194 @@
#include "cloudage.h"
Cloudage::Cloudage(int radius)
{
m_iRadius = radius;
}
void Cloudage::setRadius(int radius)
{
m_iRadius = radius;
}
QImage Cloudage::readImage(QString imagePath)
{
QImage qImage;
qImage.load(imagePath);
m_qImgPath = imagePath;
return qImage;
}
QImage Cloudage::createGrayscaleImage(int width, int height)
{
QImage grayscaleImage(width, height, QImage::Format_Indexed8);//提问如果使用QImage::Format_Grayscale8怎么实现
QVector<QRgb> grayTable; //设置颜色表
for (int i = 0; i < 256; i++)
grayTable.push_back(qRgb(i, i, i));
grayscaleImage.setColorTable(grayTable);
return grayscaleImage;
}
void Cloudage::getPosOfCenterpixel(int width, int height, int &widthCenter,int &heightCenter)
{
widthCenter = width/2;
heightCenter = height/2;
}
bool Cloudage::isValidPos(int x1, int y1, int x2, int y2)
{
float tmp =pow((x1 - x2), 2) + pow((y1 - y2), 2);
float distance = sqrt(tmp);
if(distance > m_iRadius)
return false;
else
return true;
}
float Cloudage::getcloudage1(QImage image, bool saveBinaryImg)
{
int width=image.width();
int height=image.height();
int widthCenter;
int heightCenter;
getPosOfCenterpixel(width,height,widthCenter,heightCenter);
QImage cloudQImage = createGrayscaleImage(width, height);
// int cloudInt[width][height] = {0};//错误:不能用变量在栈上定义数组 → 只能定义在堆上!
//申请空间
int** cloudInt = new int*[width];
for(int i=0;i<width;i++)
cloudInt[i] = new int[height];
//云点识别
float cloudPixelCounter = 0;
float totalPixelCountor = 0;
for(int i=0;i<width;i++)
{
for(int j=0;j<height;j++)
{
if(!isValidPos(i,j,widthCenter,heightCenter))//判断是否在有效半径内,如果不在就不统计
{
cloudQImage.setPixel(i,j,0);
continue;
}
totalPixelCountor++;
QColor pixelTmp = image.pixelColor(i,j);
float red = (float)pixelTmp.red();
float blue = (float)pixelTmp.blue();
float rate = red/blue;
if(rate>0.6)
{
cloudQImage.setPixel(i,j,255);
cloudInt[i][j] = 1;
cloudPixelCounter++;
}
else
{
cloudQImage.setPixel(i,j,150);
}
}
}
//计算云量
float cloudage = cloudPixelCounter / totalPixelCountor;
if(saveBinaryImg)
{
QStringList imgPathTMP = m_qImgPath.split(".");
QString name = imgPathTMP[0] + "_BinaryImg_ratio1." + imgPathTMP[1];
cloudQImage.save(name);
}
//释放空间
for(int i=0;i<width;i++)
delete []cloudInt[i];
delete []cloudInt;
return cloudage;
}
float Cloudage::getcloudage2(QImage image, bool saveBinaryImg)
{
int width=image.width();
int height=image.height();
int widthCenter;
int heightCenter;
getPosOfCenterpixel(width,height,widthCenter,heightCenter);
QImage cloudQImage = createGrayscaleImage(width, height);
// int cloudInt[width][height] = {0};//错误:不能用变量在栈上定义数组 → 只能定义在堆上!
//申请空间
int** cloudInt = new int*[width];
for(int i=0;i<width;i++)
cloudInt[i] = new int[height];
//云点识别
float cloudPixelCounter = 0;
float totalPixelCountor = 0;
for(int i=0;i<width;i++)
{
for(int j=0;j<height;j++)
{
if(!isValidPos(i,j,widthCenter,heightCenter))//判断是否在有效半径内,如果不在就不统计
{
cloudQImage.setPixel(i,j,0);
continue;
}
totalPixelCountor++;
QColor pixelTmp = image.pixelColor(i,j);
float red = (float)pixelTmp.red();
float blue = (float)pixelTmp.blue();
float rate = (blue - red) / (blue + red);
if(rate<0.2)
{
cloudQImage.setPixel(i,j,255);
cloudInt[i][j] = 1;
cloudPixelCounter++;
}
else
{
cloudQImage.setPixel(i,j,150);
}
}
}
//计算云量
float cloudage = cloudPixelCounter / totalPixelCountor;
if(saveBinaryImg)
{
QStringList imgPathTMP = m_qImgPath.split(".");
QString name = imgPathTMP[0] + "_BinaryImg_ratio2." + imgPathTMP[1];
cloudQImage.save(name);
}
//释放空间
for(int i=0;i<width;i++)
delete []cloudInt[i];
delete []cloudInt;
return cloudage;
}