предисловие
Для преобразования цветового пространства мы познакомим вас с ним через реальный бой HSV. Что касается преобразования и применения других цветовых пространств, в дальнейшем будут получены другие знания. Начиная с этой статьи, мы узнаем о геометрических преобразованиях OpenCV.
Например, в области обработки изображений мы часто сталкиваемся с такими операциями, как масштабирование изображения, поворот и т. д., особенно для пользователей, имеющих опыт использования PS, эти операции должны быть легко поняты, но на самом деле лежащий в их основе код представляет собой знания, которые будут объяснены позже. В этой статье мы познакомим вас с масштабированием.
зум
В OpenCV функция масштабирования, которую он нам предоставляет, — это cv2.resize(), которая определяется следующим образом:
def resize(src, dsize, dst=None, fx=None, fy=None, interpolation=None):
src: представляет исходное изображение, которое необходимо масштабировать.
dsize: размер масштабированного изображения, также называемый размером
fx: представляет масштаб горизонтального масштабирования
fy: представляет коэффициент вертикального масштабирования
интерполяция: представляет метод интерполяции
Значения интерполяционной интерполяции приведены в таблице:
тип | инструкция |
---|---|
cv2.INTER_LINEAR | Билинейная интерполяция (по умолчанию) |
cv2.INTER_NEARSET | интерполяция ближайшего соседа |
cv2.INTER_CUBIC | Интерполяция кубическим сплайном. Сначала аппроксимация кубическим сплайном выполняется на соседней области 4*4 рядом с исходным изображением, а затем значение кубического сплайна, соответствующее целевому пикселю, используется в качестве значения пикселя, соответствующего целевому изображению. |
cv2.INTER_AREA | Региональная интерполяция, выборка текущего пикселя осуществляется по пикселям в окружающей области текущего пикселя, этот метод аналогичен методу ближайшей интерполяции |
cv2.INTER_LANCZ0S4 | Метод интерполяции Ланцоша с использованием ближайших соседей 8*8 |
cv2.INTER_LINEAR_EXACT | Битовая билинейная интерполяция |
cv2.INTER_MAX | маска разностного кодирования |
cv2.WARP_FILL_OUTLIERS | Значение масштабирования для заполнения всех пикселей целевого изображения. Если некоторые из них соответствуют особым точкам (выбросам) на исходном изображении, им будет присвоено значение 0. |
cv2.WARP_INVERSE_MAP | Скалярное значение, обратное преобразование, например, преобразование полярных координат. Если флаг не установлен, преобразовать: dst(Ø,p)=src(x,y); если флаг установлен, преобразовать: dst(x,y)=src(Ø,p) |
В функции cv2.resize() размер целевого изображения может быть указан как «dsize», так и «fx,fy».
Когда вы используете dsize для указания, независимо от того, указано ли fx или fy, существует параметр dsize для определения размера целевого изображения, то есть dsize имеет наивысший приоритет. Конкретная математическая формула выглядит следующим образом:
ширина=(двойной)dszie.width/src.cols
высота = (двойная) dszie.height/src.rows
Следует отметить, что первый параметр dsize — это количество столбцов, а второй параметр — это количество строк, что противоположно shape.
И когда вы используете fx,fy для указания целевого размера изображения, математическая формула выглядит следующим образом:
dsize=Size(round(fxsrc.cols),round(fysrc.rows))
Что касается интерполяции конечного параметра, то она относится к присвоению значений пикселям, значения которых нельзя получить напрямую через сопоставление при выполнении геометрической обработки изображения. Например, изображение будет увеличено в 2 раза в области определенного размера.Некоторые изображения могут быть слишком маленькими, чтобы вместить некоторые недостающие пиксели, а некоторые изображения могут быть слишком большими, чтобы иметь больше пикселей.Для этих пикселей интерполяция определяет, как их определить.
dsize реализует масштабирование
Теперь, когда мы понимаем все параметры функции масштабирования resize в OpenCV, давайте реализуем простое масштабирование изображения, конкретный код выглядит следующим образом:
import cv2
img = cv2.imread("4.jpg")
rows,cols=img.shape[:2]
size=(int(cols*2),int(rows*1))
result = cv2.resize(img, size)
cv2.imshow("img", img)
print(img.shape)
cv2.imshow("result", result)
print(result.shape)
cv2.waitKey()
cv2.destroyAllWindows()
Здесь мы сначала получаем длину и ширину пикселей изображения через img.shape, а затем сохраняем строку без изменений и столбец, увеличенный в 2 раза. После запуска мы получим следующее изображение.
fx,fy добиться масштабирования
Выше мы достигли масштабирования с помощью параметра dszie, а теперь мы достигаем масштабирования с помощью параметров fx и fy Конкретный код выглядит следующим образом:
import cv2
img = cv2.imread("4.jpg")
result = cv2.resize(img, None,fx=2,fy=1)
cv2.imshow("img", img)
print(img.shape)
cv2.imshow("result", result)
print(result.shape)
cv2.waitKey()
cv2.destroyAllWindows()
Действие этого кода такое же, как и выше, и текущий результат не отображается. Видно, что код fx и fy будет более лаконичным и понятным.