OpenCV (14) --- Переназначение геометрического преобразования

OpenCV
OpenCV (14) --- Переназначение геометрического преобразования

что такое переназначение

Размещение пикселей одного изображения в указанном месте на другом изображении называется переназначением. Простой для понимания, то есть копирование одного изображения в другое изображение.

В OpenCV он предоставляет нам функцию cv2.remap() в качестве переназначения, которая определяется следующим образом:

def remap(src, map1, map2, interpolation, dst=None, borderMode=None, borderValue=None): 

src: представляет исходное изображение

map1: может представлять карту точек (x, y) или значение x точек типа CV_16SC2, CV_32FC1, CV_32FC2 (x, y)

map2: когда текущая карта1 представляет отображение (x, y) точек, значение пусто. Когда map1 представляет значение x точки типа CV_16SC2, CV_32FC1, CV_32FC2 (x, y), значение является значением y точки типа CV_16UC1, CV_32FC1 (x, y).

интерполяция, borderMode, borderValue аналогичны предыдущим.

Следует отметить, что карта1 относится к номеру столбца, в котором находится пиксель, а карта2 относится к номеру строки, в которой находится пиксель.

копировать пиксель

Теперь предположим, что требуется сопоставить все пиксели целевого изображения с пикселями в 100-й строке и 200-м столбце исходного изображения. Конкретная реализация выглядит следующим образом:

import cv2
import numpy as np

img = cv2.imread("4.jpg")
rows, cols, ch = img.shape
mapx = np.ones(img.shape[:2], np.float32) * 200
mapy = np.ones(img.shape[:2], np.float32) * 100
result_img = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)
cv2.imshow("img", img)
cv2.imshow("result_img", result_img)
cv2.waitKey()
cv2.destroyAllWindows()

Как показано в приведенном выше коде, мы устанавливаем все пиксели как пиксели исходного изображения (100, 200), и мы получаем очень сплошное цветное изображение, эффект следующий:点像素设置

скопировать все изображение

Таким образом, поскольку вы можете скопировать определенный пиксель, вы определенно можете скопировать все изображение. Затем мы копируем все изображения с левой стороны рисунка выше на правую сторону, конкретный код выглядит следующим образом:

import cv2
import numpy as np

img = cv2.imread("4.jpg")
rows, cols, ch = img.shape
mapx = np.ones(img.shape[:2], np.float32)
mapy = np.ones(img.shape[:2], np.float32)
for i in range(rows):
    for j in range(cols):
        mapx.itemset((i,j),j)#设置每个点映射原图的Y坐标
        mapy.itemset((i,j),i)#设置每个点映射原图的X坐标
result_img = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)
cv2.imshow("img", img)
cv2.imshow("result_img", result_img)
cv2.waitKey()
cv2.destroyAllWindows()

Здесь мы сопоставляем все точки со всеми точками, и каждый пиксель соответствует один к одному, чтобы завершить копию исходного изображения. После запуска эффект следующий:copy

Отразить вокруг оси X

Через функцию cv2.remap() мы можем не только переназначить пиксели, но и перевернуть отображение, то есть добиться через него эффекта переворота по оси X, пока ось X остается неизменной, а Значение координаты Y выполняется симметрично с осью X Просто поменять местами.

Измените строку в приведенном выше коде, код выглядит следующим образом:

import cv2
import numpy as np

img = cv2.imread("4.jpg")
rows, cols, ch = img.shape
mapx = np.ones(img.shape[:2], np.float32)
mapy = np.ones(img.shape[:2], np.float32)
for i in range(rows):
    for j in range(cols):
        mapx.itemset((i,j),j)
        mapy.itemset((i,j),rows-1-i)#修改这一行即可,对称
result_img = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)
cv2.imshow("img", img)
cv2.imshow("result_img", result_img)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска получаем перевернутое изображение вокруг оси X, эффект следующий:绕X轴翻转

Отразить вокруг оси Y

Поскольку мы можем перевернуть X с помощью функции cv2.remap(), мы также можем перевернуть вокруг оси Y, если значение координаты X заменяется на ось Y в качестве симметрии.

Нечего сказать, сразу к коду:

import cv2
import numpy as np

img = cv2.imread("4.jpg")
rows, cols, ch = img.shape
mapx = np.ones(img.shape[:2], np.float32)
mapy = np.ones(img.shape[:2], np.float32)
for i in range(rows):
    for j in range(cols):
        mapx.itemset((i,j),cols-1-j)#修改这一行即可
        mapy.itemset((i,j),i)#
result_img = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)
cv2.imshow("img", img)
cv2.imshow("result_img", result_img)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска мы получаем изображение, перевернутое вокруг оси Y:绕Y轴翻转

Отразить вокруг оси XY

Так что насчет того, чтобы щелкнуть вместе вокруг оси XY? Здесь две строки кода меняются вместе:

import cv2
import numpy as np

img = cv2.imread("4.jpg")
rows, cols, ch = img.shape
mapx = np.ones(img.shape[:2], np.float32)
mapy = np.ones(img.shape[:2], np.float32)
for i in range(rows):
    for j in range(cols):
        mapx.itemset((i,j),cols-1-j)
        mapy.itemset((i,j),rows-1-i)
result_img = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)
cv2.imshow("img", img)
cv2.imshow("result_img", result_img)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска эффект следующий:绕XY轴翻转

сжатый пополам

То есть, чтобы уменьшить исходное изображение до нормального, нажмите, чтобы уменьшить ось Y до нормального, просто установите ось X в 2 раза. Конкретный код выглядит следующим образом:

import cv2
import numpy as np

img = cv2.imread("4.jpg")
rows, cols, ch = img.shape
mapx = np.ones(img.shape[:2], np.float32)
mapy = np.ones(img.shape[:2], np.float32)
for i in range(rows):
    for j in range(cols):
        mapx.itemset((i,j),j)
        mapy.itemset((i,j),2*i)#修改这行代码即可
result_img = cv2.remap(img, mapx, mapy, cv2.INTER_LINEAR)
cv2.imshow("img", img)
cv2.imshow("result_img", result_img)
cv2.waitKey()
cv2.destroyAllWindows()

После запуска эффект отображается следующим образом:压缩原图像

Поскольку он может быть сжат, это означает, что сокращение также может быть достигнуто.Конкретное выполнение сокращения может быть использовано в качестве тренировочного упражнения для закрепления и освоения всеми.Блогер не будет повторять их здесь.