Tworzę funkcję za pomocą C++ i OpenCV, która wykrywa kolor piksela na obrazku, określa zakres kolorów, w którym on się znajduje i zastępuje go kolorem ogólnym. Na przykład kolor zielony może być w zakresie od ciemnozielonego do jasnozielonego, program określi, że nadal jest zielony i zastępuje go prostym zielonym, co sprawia, że obraz wyjściowy wygląda bardzo prosto. wszystko jest ustawione, ale mam problem z określeniem charakterystyki każdego zakresu i byłem ciekawy, czy ktoś wie, czy też formuła, która, biorąc pod uwagę wartości BGR, mogłaby określić ogólny kolor piksela. Jeśli nie, będę musiał dużo eksperymentować i zrobić to sam, ale jeśli coś już istnieje, zaoszczędziłoby to czasu. Zrobiłem wiele badań i nie znalazłem nic do tej pory.Czy istnieje wzór do określenia ogólnego koloru z podanymi wartościami BGR? (OpenCV i C++)
Odpowiedz
Tak, co prawdopodobnie znaczy „Ogólny kolor piksela” jest albo "Hue" or "Saturation" of the color.
Więc chcesz formułę przekształcenia RGB do HSV (Hue, Saturation, Value), a potem będzie tylko zainteresowany wartościami Barwy lub Nasycenia.
Patrz: Algorithm to convert RGB to HSV and HSV to RGB in range 0-255 for both
EDIT: Być może trzeba do max obecnie nasycenia, a następnie przekształcić go z powrotem do RGB, i sprawdzić, która wartość jest najwyższa (na przykład (255,0,0) lub (255,0,255) itd
Jeśli chcesz, aby Twoje zdjęcie prostsze (czyli z mniej kolorów), ale przystojny, masz kilka opcji:
prostym rozwiązaniem byłoby podzielić (z podziałem całkowitym) przez współczynnik
N
obrazu, a następnie pomnożyć przez współczynnikN
.Możesz podzielić swój obraz na kolory
K
, korzystając z algorytmu grupowania, takiego jakkmeans
, pokazanego tutaj, lub algorytmu wycięcia mediany.
oryginalny obraz:
Zmniejszone kolorów (kwantyzowane N = 64
)
Zmniejszone kolorów (klastrowych K = 8
):
Kod kwantyzacji:
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat3b img = imread("path_to_image");
imshow("Original", img);
uchar N = 64;
img /= N;
img *= N;
imshow("Reduced", img);
waitKey();
return 0;
}
kmeans Kod:
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat3b img = imread("path_to_image");
imshow("Original", img);
// Cluster
int K = 8;
int n = img.rows * img.cols;
Mat data = img.reshape(1, n);
data.convertTo(data, CV_32F);
vector<int> labels;
Mat1f colors;
kmeans(data, K, labels, cv::TermCriteria(), 1, cv::KMEANS_PP_CENTERS, colors);
for (int i = 0; i < n; ++i)
{
data.at<float>(i, 0) = colors(labels[i], 0);
data.at<float>(i, 1) = colors(labels[i], 1);
data.at<float>(i, 2) = colors(labels[i], 2);
}
Mat reduced = data.reshape(3, img.rows);
reduced.convertTo(reduced, CV_8U);
imshow("Reduced", reduced);
waitKey();
return 0;
}
Stodoła Moulton <3 – bcrist
Jeśli chcesz uzyskać dostęp do wartości RGB wszystkich pikseli, a następnie poniżej jest kod,
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat image = imread("image_path");
for(int row = 1; row < image.rows; row++)
{
for(int col = 1; col < image.cols; col++)
{
Vec3b rgb = image.at<Vec3b>(row, col);
}
}
}
- 1. Czy istnieje wzór do tego?
- 2. Tworzenie zamaskowanej tablicy w języku Python z wieloma podanymi wartościami
- 3. Konwersja jednego koloru z cvtColor
- 4. Czy istnieje podspec dla Opencv?
- 5. Wykrywanie koloru opencv
- 6. Uzyskanie koloru dominacji opencv
- 7. Czy istnieje sposób określenia fizycznej wielkości monitora?
- 8. Czy istnieje powód do wyraźnego określenia typu szablonu?
- 9. C++/OpenCV: Jak używać BOWImgDescriptorExtractor do określenia, które klastry odnoszą się do obrazów w słowniku?
- 10. Czy istnieje sposób określenia portu lokalnego do użycia w tcpClient?
- 11. Czy istnieje wzór do synchronizowania list danych w sieci?
- 12. C++ i OpenCV pobrać i ustawić kolor piksela do Mat
- 13. Czy istnieje standardowy wzór dla ExtJS
- 14. Algorytm do obliczania harmonogramu z podanymi ograniczeniami
- 15. Czy istnieje wzór log4net dla MachineName
- 16. Python 2.7 i Opencv 3.0.0 cvtColor nie działają dla konwersji BGR/RGB
- 17. Czy istnieje dobry wzór do ponownego wykorzystania zapytań Morphy?
- 18. Znajdź wartość procentową koloru między dwoma znanymi kolorami.
- 19. Czy istnieje sposób określenia ścieżki * rzeczywistej * zapisu sesji?
- 20. Czy istnieje dobry wzór do ujawnienia kolekcji ogólnej jako readonly?
- 21. C# dostęp do właściwości obiektu ogólnego
- 22. Czy istnieje odpowiedni algorytm do wykrywania koloru tła figury?
- 23. Czy istnieje specyfikator formatu, który działa z wartościami typu Boolean?
- 24. jak sprawdzić, czy lista z tymi samymi wartościami istnieje
- 25. nieznany wzór koloru na kolor tła przypisują
- 26. C++ i CRTP realizacja wzór i dylemat
- 27. Jakie jest znaczenie inicjowania tablic kierunkowych poniżej z podanymi wartościami podczas opracowywania programu szachowego?
- 28. C#: Przekazywanie ogólnego obiektu
- 29. Ogólny wzór obiektu zerowego w C#
- 30. Powiązanie z DataGridView - czy istnieje sposób "powiązania" koloru tła komórki?
„ogólny kolor piksela "jest nieco niejasny - czy istnieje stała liczba kolorów, do których chcesz zamapować wszystkie kolory? Można podzielić każdą przestrzeń kolorów na k różnych wartości, aby utworzyć małą przestrzeń, którą można oznaczyć.'int three_reds = int (floor (R/3)); ... "Można wtedy po prostu odwzorować każdy zakres na pojedynczy kolor z przestrzeni RGB. – Pyrce
Chociaż istnieją tysiące sposobów, aby to zrobić, niektóre znacznie lepiej niż inne, uważam, że powinieneś był być w stanie wymyślić przynajmniej podstawową implementację, gdy zobaczysz ideę kostki kolorów. 8 kolorów narożników to czarno-białe, czyste RGB i uzupełniające się kolory. (więc wszystkie 6 kolorów tęczy). Po prostu wybieranie najbliższego rogu dałoby ci coś do pokazania. – MSalters
Istnieje kilka. Sprawdź "kwantyzację koloru". – beaker