[QT-Kursdesign] Drei: Graustufen, Binarisierung von Bildern (einstellbarer Schwellenwert), 3×3-Mittelwertfilterung

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.
Graustufen
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.
Layout-Schnittstelle
Neue Struktur
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.
Einstellung der Einstellstangengrenze
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.
Binarisierungs-Renderings

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
Fügen Sie hier eine Bildbeschreibung ein
: 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
Fügen Sie hier eine Bildbeschreibung ein
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.

Supongo que te gusta

Origin blog.csdn.net/weixin_43035795/article/details/127975422
Recomendado
Clasificación