Цель
- Изучите несколько арифметических операций с изображениями, таких как сложение, вычитание, побитовые операции и т. д.
- Вы изучите следующие функции:cv.add,cv.addWeightedЖдать.
добавление изображения
Вы можете передать функцию OpenCVcv.add()
или просто с помощью операций numpyres = img1 + img2
Добавьте два изображения. Оба изображения должны иметь одинаковую глубину и тип, иначе второе изображение может быть просто скалярным значением.
Уведомление
Существует разница между добавлением OpenCV и добавлением Numpy. Добавление OpenCV — это операция насыщения, а добавление Numpy — операция по модулю.
Например, рассмотрим следующий пример:
>>> x = np.uint8([250])
>>> y = np.uint8([10])
>>> print( cv.add(x,y) ) # 250+10 = 260 => 255
[[255]]
>>> print( x+y ) # 250+10 = 260 % 256 = 4
[4]
Это будет более заметно, когда будут добавлены два изображения. Функции OpenCV дадут лучшие результаты. Поэтому всегда лучше придерживаться функций OpenCV.
слияние изображений
Это также добавление изображения, но оно весит по-разному, чтобы придать ему смешанный или прозрачный вид. Добавьте изображения в соответствии со следующим уравнением:
?G(x)= (1 - alpha)f0(x)+ alpha f1(x)?
Изменив $alpha$ с $0rightarrow1$, вы можете выполнять крутые переходы от одного изображения к другому.
Здесь я взял два изображения и объединил их вместе. Первое изображение имеет вес 0,7, а второе изображение имеет вес 0,3.cv.addWeighted()
Примените следующую формулу к изображению.
?dst=alpha cdot img1+beta cdot img2 + gamma?
Здесь $gamma$ считается нулем.
img1 = cv.imread('ml.png')
img2 = cv.imread('opencv-logo.png')
dst = cv.addWeighted(img1,0.7,img2,0.3,0)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()
Проверьте следующие результаты:
побитовые операции
Это включает в себя побитовоеAND
,OR
,NOT
иXOR
работать. Они очень полезны при извлечении любой части изображения (как мы увидим в последующих главах), определении и работе с непрямоугольными ROI и т. д. Ниже мы увидим пример того, как изменить определенную область изображения. Я хочу поместить логотип OpenCV поверх изображения. Если я добавляю два изображения, они меняют цвет. Если я смешаю его, я получу эффект прозрачности. Но я хочу, чтобы он был непрозрачным. Если это прямоугольная область, я могу использовать область интереса, как мы это делали в предыдущей главе. Но логотип OpenCV не прямоугольный. Таким образом, вы можете сделать это, используя побитовые операции, например:
Я хочу разместить логотип OpenCV над изображением. Если вы добавите два изображения, оно изменит цвет. Если я смешаю его, я получу эффект прозрачности. Но я хочу, чтобы он был непрозрачным. Если это прямоугольная область, вы можете использовать ROI, как в предыдущей главе. Но логотип OpenCV не прямоугольник. Таким образом, вы можете выполнять побитовые операции следующим образом:
# 加载两张图片
img1 = cv.imread('messi5.jpg')
img2 = cv.imread('opencv-logo-white.png')
# 我想把logo放在左上角,所以我创建了ROI
rows,cols,channels = img2.shape
roi = img1[0:rows, 0:cols ]
# 现在创建logo的掩码,并同时创建其相反掩码
img2gray = cv.cvtColor(img2,cv.COLOR_BGR2GRAY)
ret, mask = cv.threshold(img2gray, 10, 255, cv.THRESH_BINARY)
mask_inv = cv.bitwise_not(mask)
# 现在将ROI中logo的区域涂黑
img1_bg = cv.bitwise_and(roi,roi,mask = mask_inv)
# 仅从logo图像中提取logo区域
img2_fg = cv.bitwise_and(img2,img2,mask = mask)
# 将logo放入ROI并修改主图像
dst = cv.add(img1_bg,img2_fg)
img1[0:rows, 0:cols ] = dst
cv.imshow('res',img1)
cv.waitKey(0)
cv.destroyAllWindows()
См. результаты ниже. На изображении слева показана маска, которую мы создали. На изображении справа показан окончательный результат. Для лучшего понимания покажите все промежуточные изображения в коде выше, особенно img1бг и img2фг.
практические вопросы
- использовать
cv.addWeighted
Функция создания слайд-шоу изображений в папке с плавными переходами между изображениями