#c #opencv #image-processing
Вопрос:
Я пишу эту программу для своего курса обработки изображений, и мне нужно создать окно размером 30 (я предполагаю, что 30 пикселей, так как мой инструктор не указал), где я выполняю линейное преобразование серой шкалы всех пикселей, которые находятся в рамке окна. Я написал следующий код:
// create a window 30 image to modify
Mat window30(relax.size(), relax.type());
// traverse through the whole image with our 5x6 window and linearly transform the pixel values in the image
for (int i = 0; i < window30.rows; i=i 5)
{
for (int j = 0; j < window30.cols; j=j 6)
{
for (int n = 0; n < 5; n )
{
for (int m = 0; m < 6; m )
{
// if pixel value is below 50 set that value to 0
if (window30.at<uchar>(i n,j m) < 50)
{
window30.at<uchar>(i n, j m) = 0;
}
// if between 50 and 169 transform it to the value multiplied by 1.08875
else if (window30.at<uchar>(i n, j m) >= 50 and window30.at<int>(i n, j m) < 170)
{
window30.at<uchar>(i n, j m) = 1.08875 * window30.at<int>(i n, j m);
}
// else just set value to 255
else
{
window30.at<uchar>(i n, j m) = 255;
}
}
}
}
}
imshow("window30", window30);
waitKey(0);
Это мой первый опыт работы с компьютерным зрением с использованием OpenCV и C . Я знаю, что мой код-мусор, но я застрял на этой проблеме весь день и знаю, что должен быть способ сделать это.
Я использую Visual Studio 2019 и самую последнюю версию OpenCV.
Заранее благодарю вас всех.
Комментарии:
1. почему ты делаешь это вот так, блоками? это потенциально медленнее, чем делать это простым способом. и что это за язык, на котором у вас есть
and
оператор? В C их нет, если вы не используете определение препроцессора. если вам нужен наиболее эффективный метод, работайте с целыми ковриками и масками.Mat mask1 = (window30 < 50), mask2 = (window30 >=170); ...some more stuff here... window30.setTo(0, mask1); window30.setTo(255, mask2);
2. У @ChristophRackwitz
C
действительно есть операторыand
иor
, просто в культурном плане они мало используются. en.cppreference.com/w/cpp/language/operator_alternative3. Вы также можете ускорить
cv::Mat
доступ с помощьюMat
итератора: cv::MatIterator_, очень полезного, если вы выполняете несколько операций над смежными пикселями.