【QT数字图像处理】(五)自己写的几个小模块函数

QT实现灰度直方图均衡化的几个小模块

    • ui界面设计
    • 全局变量定义
    • 绘制直方图
    • 直方图均衡化

ui界面设计

1.主窗体
2.label:原灰度图
3.label_2:变换后的灰度图
4.chart:原灰度图的直方图
5.chart_2:变换后灰度图的直方图

全局变量定义

/*全局变量定义*/
static QImage* img;//原RGB图
static QImage* grayImg;//灰度图
int grayData;//存储灰度直方图
float oneData;//存储归一化灰度直方图
float sumData;//存储累计归一化的直方图
//存储均衡化的灰度直方图

绘制直方图

/*绘制直方图*/
void MainWindow::paintHistogram(){
	int yRange = 0;
	QBarSet *set = new QBarSet("灰度值");
	for(int i = 0; i < 256; i++){
		
	}
}

直方图均衡化

/*直方图均衡化*/
void MainWindow::balanceHistogram(){
	//统计直方图每个灰度级出现的次数
	int width = grayImg->width();
	int height = grayImg->height();
	//data[]存储灰度直方图
	data[256]{0};
	for(int i = 0; i < width; i++){
		for(int j = 0; j < height; j++){
			//提取RGB分量
			QRgb pixel = img->pixel(i, j);
			int r = qRed(pixel);
			int g = qGreen(pixel);
			int b = qBlue(pixel);
			//获取灰度值
			int average = (r + g + b)/3;
			int index = average;
			++data[index];
		}
	}
	//oneData[]存储归一化灰度直方图
	oneData[256]{0};
	for(int i = 0; i < 256; i++){
		oneData[i] = float(data[i]) / (width * height);
	}
	//累计归一化的直方图
	//sumData[]存储累计归一化的直方图
	sumData[256]{0};
	sumData[0] = oneData[0];
	for(int i = 1; i < 256; i++){
		sumData[i] = sumData[i - 1] + oneData[i];
	}
	//重新计算均衡化后的灰度值,四舍五入
	uchar grayEqual[256]{0};
	for(int i = 0; i < 256; i++){
		grayEqual[i] = (uchar)(255 * sumData[i] + 0.5);
	}
	//更新原灰度图中每个点的像素值
	QImage* newgrayImg = new QImage(width, height, grayImg->format());
	for(int i = 0; i < width; i++){
		for(int j = 0; j < height; j++){
			QRgb pixel = grayImg->pixel(i, j);
			int gray = qRed(pixel);
			gray = grayEqual[gray];
			newgrayImg->setPixel(i, j, qRgb(gray, gray, gray));
		}
	}
	ui->label_2->setPixmap(QPixmap::fromImage(*newgrayImg));
}

你可能感兴趣的:(QT数字图像处理,qt)