Aby dodać stałą wartość do wartości nasycenia każdego piksela, robię to w podwójnych pętlach. Zastanawiam się, czy istnieje jakaś prostsza i szybsza realizacja tego polecenia.Jak zmienić wartości nasycenia za pomocą opencv?
Odpowiedz
Mat img(200, 300, CV_8UC1);
Mat saturated;
double saturation = 10;
double scale = 1;
// what it does here is dst = (uchar) ((double)src*scale+saturation);
img.convertTo(saturated, CV_8UC1, scale, saturation);
EDIT
Jeśli przez nasycenie, to znaczy kanał S w HSV obrazu, trzeba Separe obraz w trzech kanałach z split()
nanieść korekty nasycenia do kanału S i następnie połącz je z merge()
.
// BGR to HSV
cvCvtColor(img, img, CV_BGR2HSV);
for (int i=0; i < img.rows ; i++)
{
for(int j=0; j < img.cols; j++)
{
// You need to check this, but I think index 1 is for saturation, but it might be 0 or 2
int idx = 1;
img.at<cv::Vec3b>(i,j)[idx] = new_value;
// or:
// img.at<cv::Vec3b>(i,j)[idx] += adds_constant_value;
}
}
// HSV back to BGR
cvCvtColor(img, img, CV_HSV2BGR);
@Karlphillip - Myślę, że pytanie zostało zadane, aby poznać alternatywną odpowiedź, którą podałeś. –
W eksperymentach prób, alternatywny sposób wartości rozszczepienie HSV dostosowywania indywidualnych kanałów, a następnie wykonując seryjnej dał lepsze wyniki. Poniżej jest co pracował dla mnie wiele razy szybciej w porównaniu do przelotowego pikseli:
(h, s, v) = cv2.split(imghsv)
s = s*satadj
s = np.clip(s,0,255)
imghsv = cv2.merge([h,s,v])
Zauważ, że miałem przeliczone wartości do float32 podczas transformacji BGR2HSV uniknąć ujemne wartości podczas transformacji nasycenia do rzetelnego uint8 (domyślnie) przelewowego:
imghsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV).astype("float32")
i przekształcono go z powrotem do domyślnego Uint8 po moim regulacji nasycenia:
imgrgb = cv2.cvtColor(imghsv.astype("uint8"), cv2.COLOR_HSV2BGR)
- 1. Jak szybko zmienić jasność obrazu za pomocą pythona + OpenCV?
- 2. Śledzenie za pomocą androida za pomocą opencv
- 3. Jak zmienić wszystkie wartości wejściowe na wielkie za pomocą Jquery?
- 4. ANDROID - wykrywanie koloru za pomocą openCV - jak?
- 5. Jak usunąć zniekształcenia promieniowe z obrazów za pomocą OpenCV?
- 6. Najlepszy sposób wyszukiwania wartości nasycenia na posortowanej liście
- 7. Wykrywanie określonego kształtu za pomocą OpenCV
- 8. Obracanie punktu wokół punktu za pomocą OpenCV
- 9. Wykrywanie linii poziomej za pomocą OpenCV
- 10. Usuwanie hałaśliwych pikseli za pomocą opencv
- 11. Jak zmienić kolor tła za pomocą JavaScript?
- 12. Jak zmienić odcień tekstury za pomocą GLSL?
- 13. Jak zmienić swoje imię za pomocą Smack?
- 14. Jak zmienić wartość opóźnienia za pomocą angularjs?
- 15. Jak zmienić kolor linku za pomocą CSS
- 16. Jak zmienić atrybut danych za pomocą jQuery?
- 17. Jak zmienić strefę czasową za pomocą adb
- 18. Jak zmienić kształt kursora za pomocą PyQt?
- 19. Jak zmienić pozycję elementu za pomocą jQuery
- 20. Jak zmienić zasięg/uprawnienia za pomocą Microsoft.Web.WebPages.OAuth
- 21. Jak zmienić image.source za pomocą C#?
- 22. Jak zmienić CSS za pomocą jQuery?
- 23. Jak zmienić rozmiar okna za pomocą JQuery?
- 24. Jak zmienić css elementu za pomocą jQuery
- 25. Jak mogę zmienić obraz za pomocą CamanJS?
- 26. Jak zmienić szerokość CubeGeometry za pomocą Three.js?
- 27. Jak zmienić kolor obrazu za pomocą jquery
- 28. Jak zmienić nazwę atrybutu za pomocą XSLT?
- 29. Jak zmienić zawartość Span za pomocą jQuery?
- 30. Jak zmienić wersję Ruby za pomocą RVM?
Powyższa funkcja będzie działać na każdym rodzaju matrycy, po prostu su bstitute CV_8UC1 dla Twojego typu. Dokumentację funkcji convertTo można znaleźć tutaj (http://opencv.itseez.com/modules/core/doc/basic_structures.html#mat-convertto) – Chris
Tak, jeśli chcesz traktować tylko kanał S, musiał najpierw to oddzielić. A co do tego jest szybsze - nie wiem, spróbuj obu i zobacz! – Chris
ConvertTo jest zdecydowanie zoptymalizowany, ale kara podziału i scalenia (z wszystkimi zaangażowanymi alokacjami) może być wyższa niż zysk użycia zoptymalizowanej konwersji(). Jak powiedział Chris, spróbuj i zobacz. – Sam