#c #opencv
#c #opencv
Вопрос:
Я пытаюсь сделать резкость изображения в формате HLS. Я правильно сделал размытие, но заточка не работает.
Я знаю, что Заточка-это:
1) Blur the Image: Image -gt; Blurred. 2) Make Unsharp Mask: Unsharp_Mask = Image - Blurred. 3) Sharpen the Image: Sharpened = Image Unsharp_Mask
Также я знаю, что в HLS вам не нужно делать это на каждом канале, а только на «L». Я сделал это, но это не работает.
Это мой код (я не могу использовать кнопку «код», потому что она выдает ошибку — говорит, что есть части кода, которые неправильно отформатированы как код):
// UNSHARP MASK HLS Mat* UnsharpHLS = new Mat(PaddedHLS-gt;rows, PaddedHLS-gt;cols, PaddedHLS-gt;type()); Mat* SharpHLS = new Mat(PaddedHLS-gt;rows, PaddedHLS-gt;cols, PaddedHLS-gt;type()); for (int i = 0; i lt; ImageHLS.rows; i ) { for (int j = 0; j lt; ImageHLS.cols; j ) { UnsharpHLS-gt;atlt;Vec3bgt;(i 1, j 1)[1] = ImageHLS.atlt;Vec3bgt;(i, j)[1] - PaddedHLS-gt;atlt;Vec3bgt;(i 1, j 1)[1]; SharpHLS-gt;atlt;Vec3bgt;(i 1, j 1)[1] = ImageHLS.atlt;Vec3bgt;(i, j)[1] (UnsharpHLS-gt;atlt;Vec3bgt;(i 1, j 1)[1]); } } cvtColor(*SharpHLS, Sharpened, COLOR_HLS2BGR);
Давайте предположим, что предыдущая часть кода работает (я не получаю никаких ошибок, и я уже пытался это сделать), единственная проблема заключается в упомянутом коде.
Это весь код:
#include lt;iostreamgt; #include lt;opencv2/opencv.hppgt; #include lt;cstdlibgt; #include lt;math.hgt; using namespace cv; using namespace std; int main() { // CARICAMENTO IMMAGINE Mat Original = imread("Lena.png", IMREAD_COLOR); // VERIFICA SE L'IMMAGINE E' STATA LETTA CORRETTAMENTE, IN CASO CONTRARIO RITORNA -1 if (Original.empty()) { return -1; } // CONVERSIONE COLORI Mat ImageHLS; Mat ImageRGB; Mat Blurred; Mat Sharpened; cvtColor(Original, ImageRGB, COLOR_BGR2RGB); cvtColor(Original, ImageHLS, COLOR_BGR2HLS); // CREAZIONE IMMAGINE HLS PADDED int FilterSize = 3; int Padding = FilterSize - 1; Mat* PaddedHLS = new Mat(ImageHLS.rows Padding, ImageHLS.cols Padding, ImageHLS.type()); copyMakeBorder(ImageHLS, *PaddedHLS, Padding / 2, Padding / 2, Padding / 2, Padding / 2, BORDER_DEFAULT); // BLURRING SU IMMAGINE HLS PADDED Mat* Filter = new Mat(FilterSize, FilterSize, ImageHLS.type()); for (int i = 1; i lt; PaddedHLS-gt;rows - 1; i ) { for (int j = 1; j lt; PaddedHLS-gt;cols - 1; j ) { for (int x = 0; x lt; FilterSize; x ) { for (int y = 0; y lt; FilterSize; y ) { Filter-gt;atlt;Vec3bgt;(x, y)[1] = PaddedHLS-gt;atlt;Vec3bgt;(i - 1 x, j - 1 y)[1]; } } PaddedHLS-gt;atlt;Vec3bgt;(i, j)[1] = mean(*Filter).val[1]; } } cvtColor(*PaddedHLS, Blurred, COLOR_HLS2BGR); // UNSHARP MASK HLS Mat* UnsharpHLS = new Mat(PaddedHLS-gt;rows, PaddedHLS-gt;cols, PaddedHLS-gt;type()); Mat* SharpHLS = new Mat(PaddedHLS-gt;rows, PaddedHLS-gt;cols, PaddedHLS-gt;type()); for (int i = 0; i lt; ImageHLS.rows; i ) { for (int j = 0; j lt; ImageHLS.cols; j ) { UnsharpHLS-gt;atlt;Vec3bgt;(i 1, j 1)[1] = ImageHLS.atlt;Vec3bgt;(i, j)[1] - PaddedHLS-gt;atlt;Vec3bgt;(i 1, j 1)[1]; SharpHLS-gt;atlt;Vec3bgt;(i 1, j 1)[1] = ImageHLS.atlt;Vec3bgt;(i, j)[1] (UnsharpHLS-gt;atlt;Vec3bgt;(i 1, j 1)[1]); } } cvtColor(*SharpHLS, Sharpened, COLOR_HLS2BGR); // VISUALIZZAZIONE IMMAGINI imshow("Originale", Original); imshow("Image RGB", ImageRGB); imshow("Image HLS", ImageHLS); imshow("Blurred HLS", *PaddedHLS); imshow("Blurred BGR", Blurred); imshow("Unsharp HLS", *UnsharpHLS); imshow("Sharpened HLS", *SharpHLS); imshow("Sharpened BGR", Sharpened); //CHIUDI TUTTO waitKey(0); destroyAllWindows(); }
Комментарии:
1. как вы думаете, достаточно ли «не работает»?
2. ну, если в коде что-то не так, я думаю, кто-нибудь заметит. кстати, проблема в том, что заостренное изображение «желтоватое». Как в версиях HLS, так и в версиях BGR это не заостренная версия исходного изображения, а его желтоватая версия.