Heim > Artikel > Web-Frontend > Der Weg zum Wachstum von OpenCV (3): Nachahmung des Zauberstab-Tools in PhotoShop
Das Thema dieses Artikels ist eigentlich die Konvertierung des Farbraums des Bildes mit Hilfe eines Farbauswahlprogramms, die Verwendung der Farbkonvertierungsfunktion in OpenCV und einige Vorsichtsmaßnahmen.
RGB-Farbraum: RGB verwendet die additive Farbmischungsmethode, da sie das Verhältnis verschiedener „Lichter“ zur Erzeugung von Farben beschreibt. Ausgehend von der Dunkelheit überlagert sich kontinuierlich Licht, um Farbe zu erzeugen. RGB beschreibt die Werte von rotem, grünem und blauem Licht. Die digitale Bildspeicherung verwendet im Allgemeinen den RGB-Modus. Es ist zu beachten, dass die Speicherreihenfolge der drei Kanäle in OpenCV BGR ist.
HSV, HSI: Diese beiden Farbformate werden basierend auf der Unterscheidung zwischen Farben durch das menschliche Auge definiert, wobei H (Farbton) den Farbton darstellt, S (Sättigung) die Sättigung darstellt und V (Wert) die Helligkeit darstellt, I ( Intensität) steht für Helligkeit.
Lab-Raum: Gleichmäßige Änderungen im Modell entsprechen gleichmäßigen Änderungen in der wahrgenommenen Farbe, sodass wir uns Lab als einen Punkt im Farbraum vorstellen können. Je näher die benachbarten Punkte sind, desto näher liegen sie beieinander. Je näher, daher wird der Lab-Raum oft verwendet, um die Ähnlichkeit zweier Farben zu messen.
Weitere Informationen zum Farbraum finden Sie unter: http://en.wikipedia.org/wiki/Color_space
In OpenCV Die Farbkonvertierung des Bildes wird über die Funktion cvtColor abgeschlossen, die in der Header-Datei opencv2/imgproc/imgproc.hpp definiert ist:
void cvtColor ( InputArray src, OutputArray dst, int code, int dstCn=0 )
src: Eingabebild.
dst: Ausgabebild.
Code: Farbkonvertierungstyp, wie zum Beispiel: CV_BGR2Lab, CV_BGR2HSV, CV_HSV2BGR, CV_BGR2RGB.
dstCn: Die Kanalnummer des Ausgabebildes. Wenn der Standardwert 0 ist, bedeutet dies die Anzahl der Kanäle des Eingabebildes.
Konvertieren Sie das Bild von BGR in Lab: cvtColor(image,image,CV_BGR2Lab)
Zuerst definieren wir eine colorDetect-Klasse:
class colorDetect{private: int minDist; //minium acceptable distance Vec3b target;//target color; Mat result; //the resultpublic: colorDetect(); void SetMinDistance(int dist); void SetTargetColor(uchar red,uchar green,uchar blue); void SetTargetColor(Vec3b color); //set the target color Mat process(const Mat& image); //main process};
MinDist ist der Schwellenwert, den wir definiert haben, um den Abstand zwischen zwei Farben zu begrenzen, was dem Schwellenwert des Zauberstab-Werkzeugs in PhotoShop entspricht.
Ziel ist die Zielfarbe, die der Samenfarbe entspricht. Ergebnis ist das Ergebnis der Speicherverarbeitung.
Prozess ist das Hauptverarbeitungsprogramm. Schauen wir uns den Inhalt des Prozesses an.
Mat colorDetect::process(const Mat& image) { Mat ImageLab=image.clone(); result.create(image.rows,image.cols,CV_8U); //将image转换为Lab格式存储在ImageLab中 cvtColor(image,ImageLab,CV_BGR2Lab); //将目标颜色由BGR转换为Lab Mat temp(1,1,CV_8UC3); temp.at<Vec3b>(0,0)=target;//创建了一张1*1的临时图像并用目标颜色填充 cvtColor(temp,temp,CV_BGR2Lab); target=temp.at<Vec3b>(0,0);//再从临时图像的Lab格式中取出目标颜色 // 创建处理用的迭代器 Mat_<Vec3b>::iterator it=ImageLab.begin<Vec3b>(); Mat_<Vec3b>::iterator itend=ImageLab.end<Vec3b>(); Mat_<uchar>::iterator itout=result.begin<uchar>(); while(it!=itend) { //两个颜色值之间距离的计算 int dist=static_cast<int>(norm<int,3>(Vec3i((*it)[0]-target[0], (*it)[1]-target[1],(*it)[2]-target[2]))); if(dist<minDist) (*itout)=255; else (*itout)=0; it++; itout++; } return result; }
Es gibt zwei Punkte, die im Programm besondere Aufmerksamkeit erfordern:
1. Nach der Konvertierung des Bildes in den Lab-Farbraum auch die Zielfarbe konvertiert werden muss, besteht der Ansatz darin, ein temporäres Image zu erstellen.
2. Die Normfunktion wird verwendet, um den Abstand zwischen zwei Farben zu bestimmen. Ihre Operation ist norm
Es lohnt sich darüber nachzudenken, ob Vec3i((*it)[0]-target[0],(*it)[1]-target[1],(*it)[2]- Was über das Ersetzen von target[2]) durch Vec3i((*it)-target)? Die Antwort lautet „Nein“, da (*it)-target den Typ des Subtraktionsergebnisses während der tatsächlichen Operation automatisch einschränkt.
Nachdem wir die Zielfarbe und den Schwellenwert wie folgt festgelegt haben, können wir einen Beispieleffekt erhalten:
cdet.SetTargetColor(150,150,150);
cdet.SetMinDistance(50);
Weitere Informationen zum OpenCV-Wachstumspfad (3): Nachahmung des Zauberstab-Tools in PhotoShop finden Sie auf der chinesischen PHP-Website für verwandte Artikel!