Artikelverzeichnis
Frontend-Artikel und Navigationsindex
Navigationsindex-Beitrag vor
dem Artikel, der zweite Artikel des Kursdesigns
Vorwort
Im letzten Kapitel haben wir die Funktion zum Öffnen von Bildern vorübergehend abgeschlossen. In diesem Kapitel beginnen wir mit der Erstellung des Bildverarbeitungslinks.
Graustufen
Das Prinzip der Graustufenbilder
In einem Farbbild wird die Farbe jedes Pixels durch drei Werte bestimmt: R, G und B. Jeder Wert ist von 0 bis 255 verteilt, und 255, 255, 255 Farben können kombiniert werden.
Die RGB-Werte von Graustufenbildern sind drei identische Werte und der Variationsbereich eines Pixels beträgt 255. Daher werden bei der digitalen Bildverarbeitung Bilder in verschiedenen Formaten im Allgemeinen in Graustufenbilder umgewandelt, um nachfolgende Bilder präziser zu machen. Die Menge an Berechnung wird weniger. Die Beschreibung von Graustufenbildern spiegelt wie Farbbilder immer noch die Verteilung und Eigenschaften der gesamten und lokalen Farb- und Helligkeitsstufen des gesamten Bildes wider. Die Graustufenverarbeitung von Bildern kann auf zwei Arten erreicht werden.
Methode eins
Ermitteln Sie für jedes Pixel den Durchschnitt der drei Komponenten R, G und B und weisen Sie diesen Durchschnitt dann den drei Komponenten dieses Pixels zu.
Methode Zwei
Gemäß dem YUV-Farbraum ist die physikalische Bedeutung der Y-Komponente die Helligkeit des Punktes. Dieser Wert spiegelt den Helligkeitsgrad wider. Entsprechend der sich ändernden Beziehung zwischen den RGB- und YUV-Farbräumen ist die Entsprechung zwischen der Helligkeit Y und den drei Farbkomponenten von R, G und B können ermittelt werden. : Y=0,3R+ 0,59G +0,11B, wobei dieser Helligkeitswert verwendet wird, um den Graustufenwert des Bildes auszudrücken.
Der Einfachheit halber können wir hier direkt Methode eins übernehmen, nämlich Gray=(R+G+B)/3;
Code
//灰度化
QImage MainWindow::gray(QImage image){
QImage newImage =image.convertToFormat(QImage::Format_ARGB32);
QColor oldColor;
for(int y = 0; y < newImage.height(); y++)
{
for(int x = 0; x < newImage.width(); x++)
{
oldColor = QColor(image.pixel(x,y));
int average = (oldColor.red() + oldColor.green() + oldColor.blue()) / 3;
newImage.setPixel(x, y, qRgb(average, average, average));
}
}
return newImage;
}
Der Zweck der Graustufenmethode besteht darin, jedes Pixel des Zielbilds grau zu skalieren, und das endgültige Bild ist ein Graustufenbild.
//灰度化按钮
void MainWindow::on_GreyBtn_clicked()
{
if(srcDirPathList.isEmpty())
{
QMessageBox::information(this,tr("请先选择图片"),
tr("请先选择图片!"));
return;
}
else{
QImage image=QImage(srcDirPathList.at(imagenum));
QImage grayimage=gray(image);
ui->piclabel->setPixmap(QPixmap::fromImage(ImageSetSize(grayimage,ui->piclabel)));
}
}
Um dann die Graustufen-Schaltflächenfunktion zu implementieren, müssen Sie vor der Graustufenverarbeitung auch überprüfen, ob ein aktuelles Bild vorhanden ist. Der Effekt ist wie unten gezeigt.
Da das Bild geändert wird, muss das Originalbild angezeigt werden. Wir werden auch die Funktion der Schaltfläche implementieren, um das Originalbild anzuzeigen.
//显示原图按钮
void MainWindow::on_YuanTuBtn_clicked()
{
if(srcDirPathList.isEmpty())
{
QMessageBox::information(this,tr("请先选择图片"),
tr("请先选择图片!"));
return;
}
else{
QImage image=QImage(srcDirPathList.at(imagenum));
ui->piclabel->setPixmap(QPixmap::fromImage(ImageSetSize(image,ui->piclabel)));
}
}
Der Code hier ist schon oft aufgetaucht, daher werde ich ihn nicht noch einmal erklären.
Binarisierung
Das Prinzip der Binarisierung
Bei der Binarisierung wird der Graustufenwert der Pixel im Bild auf 0 oder 255 gesetzt, wodurch das gesamte Bild offensichtlich schwarzweiß erscheint. Wir müssen zuerst das Bild grauskalieren und dann jeden Graustufenwert mit dem von uns festgelegten binären Anpassungswert vergleichen. Diejenigen, die größer als der Anpassungswert sind, werden direkt in Schwarz umgewandelt (255, 255, 255), und diejenigen, die kleiner als sind Der angepasste Wert wird weiß (0, 0, 0) und es kann ein Binärbild (Schwellenwertbild) erhalten werden.
Layoutanpassung
Hier müssen wir eine Anpassungsleiste zum Anpassen der Binärisierung hinzufügen. QT stellt die Qslider-Klasse bereit. Die horizontale heißt Horizontal Slider und die vertikale heißt Vertical Slider.
Der Effekt, den ich hoffe, ist: Durch willkürliches Ändern der Anpassungsleiste kann die Zahl angezeigt werden, und durch willkürliches Ändern der Zahl in LineEdit kann sich die Anpassungsleiste ändern (im Bereich von 0 bis 255).
Binärisierte Code-Implementierung
Dieser Code ist im Allgemeinen auf der Grundlage der oben genannten Prinzipien relativ einfach zu verstehen. Er nimmt rekursiv Graustufen auf, vergleicht und ändert Werte.
//二值化
QImage MainWindow::TwoSide(QImage grayimage,int value){
QImage TwoSideImage =grayimage.convertToFormat(QImage::Format_ARGB32);
QColor oldColor;
int ts;
for(int y = 0; y < grayimage.height(); y++)
{
for(int x = 0; x < grayimage.width(); x++)
{
oldColor = QColor(grayimage.pixel(x,y));
ts = oldColor.red();
if(ts<value){
ts=0;
}else{
ts=255;
}
TwoSideImage.setPixel(x,y, qRgb(ts, ts, ts));
}
}
return TwoSideImage;
}
Funktionelles Design der Einstellstange
Zunächst erfolgt die funktionale Gestaltung des ersteren.
Suchen Sie das Attribut maxmum von TwoSidelSlider und setzen Sie es auf 255, was bedeutet, dass der maximale Binärwert 255 beträgt. Minimum ist ursprünglich 0 und muss nicht angepasst werden.
Suchen Sie valueChanged () im Sprungschlitz der Anpassungsleiste. Wenn sich also der Wert der Anpassungsleiste ändert, wird der Code ausgeführt.
//二值化调节条
void MainWindow::on_TwoSidelSlider_valueChanged(int value)
{
if(srcDirPathList.isEmpty()){
QMessageBox::information(this,tr("请先选择图片"),
tr("请先选择图片!"));
return;
}
else{
QImage image=QImage(srcDirPathList.at(imagenum));//读取当前图片
QImage grayimage=gray(image);//灰度化
QImage TwoSideImage=TwoSide(grayimage,value);//二值化
ui->TwoSideLineEdit->setText(QString::number(value));//改变文本框内值为二值化比对值
ui->piclabel->setPixmap(QPixmap::fromImage(ImageSetSize(TwoSideImage,ui->piclabel)));//显示二值化图像
}
}
Der Code ist relativ einfach, mehr muss man nicht sagen.
Design der binarisierten Textfeldfunktion
Tatsächlich ist es nach dem Schreiben der Anpassungsleiste leicht, an die Textfeldfunktion zu denken. Hier ist der Code. Wenn Sie Fragen haben, können Sie die Kommentare lesen. Wenn Sie weitere Fragen haben, können Sie einen Kommentar abgeben oder mir einen senden private Nachricht.
//二值化文本框
void MainWindow::on_TwoSideLineEdit_textChanged(const QString &arg1)
{
if(srcDirPathList.isEmpty()){
QMessageBox::information(this,tr("请先选择图片"),
tr("请先选择图片!"));
return;
}
else{
int value=arg1.toInt();
if (value>=0 && value<=255)
{
QImage image=QImage(srcDirPathList.at(imagenum));
QImage grayimage=gray(image);
QImage TwoSideImage=TwoSide(grayimage,value);//都是和上面一样的
ui->TwoSidelSlider->setValue(value);//当文本框内数值改变时,动态变化调节条位置
ui->piclabel->setPixmap(QPixmap::fromImage(ImageSetSize(TwoSideImage,ui->piclabel)));
}
else
{
QMessageBox::information(this,tr("请输入正确数值"),
tr("请输入0-255!"));
return;
}
}
}
Der Binarisierungsteil der Funktion wurde abgeschlossen, aber zu diesem Zeitpunkt haben wir festgestellt, dass die Binarisierungsschaltfläche nutzlos zu sein scheint, also löschen wir sie, damit es keine nutzlosen Schaltflächen auf der Benutzeroberfläche gibt.
Das Binarisierungseffektdiagramm sieht wie folgt aus: Im Allgemeinen ist die Binarisierung nicht schwierig. Wenn die Graustufen abgeschlossen werden können, verläuft die Binarisierung reibungslos.
3x3 mittlerer Filter
3x3 Mittelfilterprinzip
Verwenden Sie die umgangssprachliche Form, um die Filterung zu definieren: Verwenden Sie für ein Pixel die relevanten Eigenschaften seines Domänenpixels (das sein eigenes x enthalten kann oder nicht), um einen Wert zu berechnen, der den aktuellen Pixelwert ersetzt.
Bei der 3x3-Mittelwertfilterung wird der Durchschnitt aller Pixelwerte im 3x3-Feld berechnet, das jedem Pixel entspricht, und das aktuelle Pixel ersetzt.
Das Prinzip der Mittelwertfilterung ist relativ einfach. Die Formel wird wie folgt ausgedrückt
: Nehmen Sie das aktuelle Pixel als Mittelpunkt, ermitteln Sie die Summe aller Grauwerte im Fenster und verwenden Sie den Durchschnittswert als neuen Grauwert des zentralen Pixels .
g(x,y) ist das zentrale Pixel der Nachbarschaft und n hängt mit der Größe der Koeffizientenvorlage zusammen. Im Allgemeinen wird n für eine 3*3-Nachbarschaftsvorlage auf 9 gesetzt. Beispielsweise
im tatsächlichen Verarbeitungsprozess , Es ist notwendig, eine Erweiterung der Bildgrenze in Betracht zu ziehen. Operation, Erweiterung auf 0 oder einen angrenzenden Pixelwert.
Da die Zeit für diesen Kurs relativ begrenzt ist, werden wir vorerst nicht darüber nachdenken, die Geschwindigkeit des Algorithmus zu optimieren. Wir werden sie später hinzufügen, wenn wir Zeit haben.
Implementierung eines Mittelwertfilters
Dieser Codeabschnitt ist möglicherweise relativ schwer zu verstehen. Ich werde in Zukunft eine separate Blog-Erklärung für diesen Codeabschnitt veröffentlichen und den Link auch hier veröffentlichen. Reden wir jetzt nicht darüber, sondern verwenden wir diesen Code, um die Funktion zu implementieren.
//均值滤波
QImage MainWindow::avg(QImage image)
{
int kernel [3][3] = {
{
1,1,1},
{
1,1,1},
{
1,1,1}};
int sizeKernel = 3;
int sumKernel = 9;
QColor color;
for(int x = sizeKernel/2;x<image.width() - sizeKernel/2;x++)
{
for(int y= sizeKernel/2;y<image.height() - sizeKernel/2;y++)
{
int r = 0;
int g = 0;
int b = 0;
for(int i = -sizeKernel/2;i<=sizeKernel/2;i++)
{
for(int j = -sizeKernel/2;j<=sizeKernel/2;j++)
{
color = QColor(image.pixel(x+i,y+j));
r+=color.red()*kernel[sizeKernel/2+i][sizeKernel/2+j];
g+=color.green()*kernel[sizeKernel/2+i][sizeKernel/2+j];
b+=color.blue()*kernel[sizeKernel/2+i][sizeKernel/2+j];
}
}
r = qBound(0,r/sumKernel,255);
g = qBound(0,g/sumKernel,255);
b = qBound(0,b/sumKernel,255);
image.setPixel(x,y,qRgb( r,g,b));
}
}
return image;
}
Die Funktion des Mittelwertfilter-Buttons sollte selbsterklärend sein.
//均值滤波按钮
void MainWindow::on_TXTBtn_clicked()
{
if(srcDirPathList.isEmpty())
{
QMessageBox::information(this,tr("请先选择图片"),
tr("请先选择图片!"));
return;
}
else{
QImage image=QImage(srcDirPathList.at(imagenum));
QImage avgimage=avg(image);
ui->piclabel->setPixmap(QPixmap::fromImage(ImageSetSize(avgimage,ui->piclabel)));
}
}
Wirkungsvergleich
Zu diesem Zeitpunkt sind alle Inhalte dieses Kapitels abgeschlossen. Wenn Sie Fragen haben oder Fehler finden, kontaktieren Sie mich bitte so schnell wie möglich.