что такое переназначение
Размещение пикселей одного изображения в указанном месте на другом изображении называется переназначением. Простой для понимания, то есть копирование одного изображения в другое изображение.
В 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()
Здесь мы сопоставляем все точки со всеми точками, и каждый пиксель соответствует один к одному, чтобы завершить копию исходного изображения. После запуска эффект следующий:
Отразить вокруг оси 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, эффект следующий:
Отразить вокруг оси 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:
Отразить вокруг оси 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()
После запуска эффект следующий:
сжатый пополам
То есть, чтобы уменьшить исходное изображение до нормального, нажмите, чтобы уменьшить ось 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()
После запуска эффект отображается следующим образом:
Поскольку он может быть сжат, это означает, что сокращение также может быть достигнуто.Конкретное выполнение сокращения может быть использовано в качестве тренировочного упражнения для закрепления и освоения всеми.Блогер не будет повторять их здесь.