Ограничительная рамка при обнаружении прыщей на лице с использованием OpenCV Python с алгоритмом KNN - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть изображение лица с пупырышками, и я хочу обнаружить все пупырышки, и я хочу нарисовать ограничивающую рамку на каждом пупырышке. Как я могу это сделать? Извините, я новичок в программировании на Python.

Я использую алгоритм KNN для классификации.

У меня есть главное окно, которое показывает ОРИГИНАЛЬНОЕ ИЗОБРАЖЕНИЕ и ОБРАБОТАННОЕ ИЗОБРАЖЕНИЕ. На обработанном изображении появится ограничительная рамка.

Вот мои коды: у меня есть 2 файла Python. Где я должен поместить код для ограничительной рамки и каков код этой функции?

Это для главного окна:

import os
import sys
import cv2
import datetime
import numpy as np
from time import sleep
from PyQt5 import QtCore, QtGui, QtWidgets

from color_recognition_api import color_histogram_feature_extraction
from color_recognition_api import knn_classifier

PATH="./training.data"

class Ui_MainWindow(object):
    def __init__(self):
        print("Initializing ....")
        if os.path.isfile(PATH) and os.access(PATH, os.R_OK):
            print ('training data is ready, classifier is loading...')
        else:
            print ('training data is being created...')
            open('training.data', 'w')
            color_histogram_feature_extraction.training()
            print ('training data is ready, classifier is loading...')

    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(640, 480)
        self.centralWidget = QtWidgets.QWidget(MainWindow)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.centralWidget.sizePolicy().hasHeightForWidth())
        self.centralWidget.setSizePolicy(sizePolicy)
        self.centralWidget.setObjectName("centralWidget")
        self.groupBox = QtWidgets.QGroupBox(self.centralWidget)
        self.groupBox.setGeometry(QtCore.QRect(10, 10, 621, 441))
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth())
        self.groupBox.setSizePolicy(sizePolicy)
        self.groupBox.setFlat(False)
        self.groupBox.setCheckable(False)
        self.groupBox.setObjectName("groupBox")
        self.gridLayout = QtWidgets.QGridLayout(self.groupBox)
        self.gridLayout.setContentsMargins(11, 11, 11, 11)
        self.gridLayout.setSpacing(6)
        self.gridLayout.setObjectName("gridLayout")
        self.pushButton = QtWidgets.QPushButton(self.groupBox)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Maximum, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth())
        self.pushButton.setSizePolicy(sizePolicy)
        self.pushButton.setObjectName("pushButton")
        self.gridLayout.addWidget(self.pushButton, 0, 0, 1, 1)
        self.lineEdit = QtWidgets.QLineEdit(self.groupBox)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.lineEdit.sizePolicy().hasHeightForWidth())
        self.lineEdit.setSizePolicy(sizePolicy)
        self.lineEdit.setMaxLength(255)
        self.lineEdit.setObjectName("lineEdit")
        self.gridLayout.addWidget(self.lineEdit, 0, 1, 1, 2)
        self.pushButton_2 = QtWidgets.QPushButton(self.groupBox)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Fixed)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.pushButton_2.sizePolicy().hasHeightForWidth())
        self.pushButton_2.setSizePolicy(sizePolicy)
        self.pushButton_2.setObjectName("pushButton_2")
        self.gridLayout.addWidget(self.pushButton_2, 1, 0, 1, 1)
        self.label_2 = QtWidgets.QLabel(self.groupBox)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label_2.sizePolicy().hasHeightForWidth())
        self.label_2.setSizePolicy(sizePolicy)
        self.label_2.setFrameShape(QtWidgets.QFrame.WinPanel)
        self.label_2.setFrameShadow(QtWidgets.QFrame.Plain)
        self.label_2.setTextFormat(QtCore.Qt.AutoText)
        self.label_2.setAlignment(QtCore.Qt.AlignCenter)
        self.label_2.setObjectName("label_2")
        self.gridLayout.addWidget(self.label_2, 2, 2, 1, 1)
        self.label = QtWidgets.QLabel(self.groupBox)
        sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred)
        sizePolicy.setHorizontalStretch(0)
        sizePolicy.setVerticalStretch(0)
        sizePolicy.setHeightForWidth(self.label.sizePolicy().hasHeightForWidth())
        self.label.setSizePolicy(sizePolicy)
        self.label.setFrameShape(QtWidgets.QFrame.WinPanel)
        self.label.setFrameShadow(QtWidgets.QFrame.Plain)
        self.label.setTextFormat(QtCore.Qt.AutoText)
        self.label.setAlignment(QtCore.Qt.AlignCenter)
        self.label.setObjectName("label")
        self.gridLayout.addWidget(self.label, 2, 0, 1, 2)
        MainWindow.setCentralWidget(self.centralWidget)
        self.statusBar = QtWidgets.QStatusBar(MainWindow)
        self.statusBar.setObjectName("statusBar")
        MainWindow.setStatusBar(self.statusBar)

        self.retranslateUi(MainWindow)

        self.dialog = QtWidgets.QFileDialog(MainWindow)
        self.dialog.setFileMode(QtWidgets.QFileDialog.AnyFile)
        self.fname = None
        self.image = None

        self.pushButton.clicked.connect(self.pushButton_clicked)
        self.pushButton_2.clicked.connect(self.pushButton2_clicked)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)

    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "Acne Detection and Classifier"))
        self.groupBox.setTitle(_translate("MainWindow", "Image Processing"))
        self.pushButton.setText(_translate("MainWindow", "Browse .."))
        self.lineEdit.setText(_translate("MainWindow", "File Location"))
        self.pushButton_2.setText(_translate("MainWindow", "Start"))
        self.label_2.setText(_translate("MainWindow", "<Processed Image>"))
        self.label.setText(_translate("MainWindow", "<Original Image>"))

    def pushButton_clicked(self):
        try:
            if self.dialog.exec_():
                self.showImage(self.dialog.selectedFiles())

        except Exception as error:
            print(error)

    def pushButton2_clicked(self):
        if self.pushButton_2.text() == "Start":
            self.pushButton_2.setText("Reset")
            try:
                color_histogram_feature_extraction.color_histogram_of_test_image(self.image)
                prediction = knn_classifier.main('training.data', 'test.data')
                print(prediction)
                self.pushButton_2.setText("Start")
            except Exception as error:
                print(error)
        else:
            self.pushButton_2.setText("Start")

    def showImage(self, files):
        for file in files:
            #print(file)
            self.fname = file
            self.lineEdit.setText(file)
            self.image = cv2.imread(file, cv2.IMREAD_COLOR)
            qimage = QtGui.QImage(file)
            pixmap = QtGui.QPixmap.fromImage(qimage)
            self.label.setPixmap(pixmap)
            self.label.setScaledContents(True)
            self.label_2.setPixmap(pixmap)
            self.label_2.setScaledContents(True)
            self.label.show()
            self.label_2.show()

            #sleep(10)

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    app.setStyle("cleanlooks")
    mainWindow = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(mainWindow)
    #mainWindow.showFullScreen()
    mainWindow.show()
    sys.exit(app.exec_())

Это для извлечения функции цветовой гистограммы:

from PIL import Image
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import itemfreq
from color_recognition_api import knn_classifier as knn_classifier


def color_histogram_of_test_image(test_src_image):

    # load the image
    image = test_src_image

    chans = cv2.split(image)
    colors = ('b', 'g', 'r')
    features = []
    feature_data = ''
    counter = 0
    for (chan, color) in zip(chans, colors):
        counter = counter + 1

        hist = cv2.calcHist([chan], [0], None, [256], [0, 256])
        features.extend(hist)

        # find the peak pixel values for R, G, and B
        elem = np.argmax(hist)

        if counter == 1:
            blue = str(elem)
        elif counter == 2:
            green = str(elem)
        elif counter == 3:
            red = str(elem)
            feature_data = red + ',' + green + ',' + blue
            # print(feature_data)

    with open('test.data', 'w') as myfile:
        myfile.write(feature_data)


def color_histogram_of_training_image(img_name):

    # detect image color by using image file name to label training data
    if 'blackheads' in img_name:
        data_source = 'blackheads'
    elif 'cysts' in img_name:
        data_source = 'cysts'
    elif 'nodules' in img_name:
        data_source = 'nodules'
    elif 'papules' in img_name:
        data_source = 'papules'
    elif 'pustules' in img_name:
        data_source = 'pustules'
    elif 'whiteheads' in img_name:
        data_source = 'whiteheads'

    # load the image
    image = cv2.imread(img_name)

    chans = cv2.split(image)
    colors = ('b', 'g', 'r')
    features = []
    feature_data = ''
    counter = 0
    for (chan, color) in zip(chans, colors):
        counter = counter + 1

        hist = cv2.calcHist([chan], [0], None, [256], [0, 256])
        features.extend(hist)

        # find the peak pixel values for R, G, and B
        elem = np.argmax(hist)

        if counter == 1:
            blue = str(elem)
        elif counter == 2:
            green = str(elem)
        elif counter == 3:
            red = str(elem)
            feature_data = red + ',' + green + ',' + blue

    with open('training.data', 'a') as myfile:
        myfile.write(feature_data + ',' + data_source + '\n')


def training():

    # blackheads color training images
    for f in os.listdir('./training_dataset/blackheads'):
        print(f)
        color_histogram_of_training_image('./training_dataset/blackheads/' + f)

    # cysts color training images
    for f in os.listdir('./training_dataset/cysts'):
        print(f)
        color_histogram_of_training_image('./training_dataset/cysts/' + f)

    # nodules color training images
    for f in os.listdir('./training_dataset/nodules'):
        print(f)
        color_histogram_of_training_image('./training_dataset/nodules/' + f)

    # papules color training images
    for f in os.listdir('./training_dataset/papules'):
        print(f)
        color_histogram_of_training_image('./training_dataset/papules/' + f)

    # pustules color training images
    for f in os.listdir('./training_dataset/pustules'):
        print(f)
        color_histogram_of_training_image('./training_dataset/pustules/' + f)

    # whiteheads color training images
    for f in os.listdir('./training_dataset/whiteheads'):
        print(f)
        color_histogram_of_training_image('./training_dataset/whiteheads/' + f) 

1 Ответ

0 голосов
/ 05 ноября 2018

Что касается рисования ограничительного прямоугольника на мате OpenCV, то это можно сделать довольно просто:

# Dummy input image
canvas = np.ones((300, 300, 3), dtype=np.uint8) * 255

cv2.rectangle(canvas, (50, 50), (100, 100), (0, 0, 255), 1)

enter image description here

...