Opencv (画像処理) - Python ベース - 画像の基本操作 - 画像に透かしを追加

ここに画像の説明を挿入

1. 画像コンピューティングの概念

コンピューターの世界では、画像はピクセルで構成され、各ピクセルは数字を表し、数字の大きさがピクセルの色を表し、すべてのピクセルの色が画像を形成します。したがって、行列を使用すると画像を適切に表現できます。
OpenCVが提供する演算方式は行列ベースの演算です。

2. 画像操作

2.1 追加()

2 つの画像を追加します (行列の各ピクセルが対応して追加されます)
結果 = cv2.add(img1,img2)
パラメーター: 2全く同じサイズの写真。
戻り値計算後のイメージ(ディープコピー)

ここに画像の説明を挿入

図 1 の lina Figure 4 の左上隅を切り取り、それを Girl Figure 2 に追加すると、図 3 に示す結果が得られます。

2.2 減算()

2 つの画像の差を計算します (行列の各ピクセルは減算に対応します)
result = cv2.subtract(img1,img2)
パラメータ: img1-img2
結果は新しいパラメータ(ディープコピー)に保存されます

ここに画像の説明を挿入

画像 1 と 2 の差分後、明るさが減少します

いくつかのコード例:

import cv2
import numpy as np


img1 = cv2.imread('./image/girl.png')
img2 = cv2.imread('./image/lina.jpg')
# 打印两个图片的参数
print(img1.shape)
print(img2.shape)

# 创建像素点为1的矩阵,并且每个像素点都乘50
img3 = np.ones((185, 185, 3), np.uint8)*100

# img2过大,我们截取部分图像,让region与img1一样大
# 截取为深拷贝,对截取的图像运算,并不改变原图像
region = img2[0:185, 0:185]
# 将两个图像运算
result = cv2.add(img1, region)
# 降低图片的亮度
low_light_result = cv2.subtract(result, img3)
# 展示图片
# cv2.imshow("img1", img1)
# cv2.imshow("img2", img2)
# cv2.imshow("region", region)
cv2.imshow('result', result)
cv2.imshow('img3', img3)
cv2.imshow('low_light_result', low_light_result)

cv2.waitKey(0)

2.3 乗算()/除算()

行列の乗算 (2 つの行列の各ピクセルを乗算)
結果 = cv2.multiply(img1,img2)
行列の除算 (2 つの行列の各ピクセルを除算)
結果 = cv2.divide()

2.4 addWeighted()

画像融合、重みによる加算
result = cv2.addWeighted(A, alpha, B, bate, gamma)
パラメータ: alpha: A の重み; bate: B の重み; ガンマ: 静的重み (演算後にガンマを追加)

ここに画像の説明を挿入

ここに画像の説明を挿入
図 1 の重みを 0.2 に、図 2 の重みを 0.8 に加算すると、図 3 が得られます。

コード表示の一部

import cv2
import numpy as np


img1 = cv2.imread('./image/girl.png')
img2 = cv2.imread('./image/lina.jpg')
# 打印两个图片的参数
print(img1.shape)
print(img2.shape)

# img2过大,我们截取部分图像,让region与img1一样大
# 截取为深拷贝,对截取的图像运算,并不改变原图像
region = img2[0:185, 0:185]


# 展示图片
cv2.imshow("img1", img1)
cv2.imshow("region", region)

# 图像融合
result = cv2.addWeighted(region, 0.2, img1, 0.8, 0)

cv2.imshow('result', result)

cv2.waitKey(0)

2.5 かつ/または/そうでない

ここでの論理演算は、私たちがよく知っている他の言語の論理演算と一致しています。マトリックスの各ピクセルに対して論理演算を実行することです。

bitwise_and()

画像のビットごとの AND 演算
結果 = cv2.bitwise_and(img1, img2)

bitwise_or()

画像のビットごとの OR 演算
結果 = cv2.bitwise_or(img1, img2)

bitwise_not()

画像非操作
結果 = cv2.bitwise_not(img)

ビットワイズ_xor

画像のビットごとの XOR 演算 (同じが 0、差が 1)
result = cv2.bitwise_xor(img1, img2)

コード表示の一部

import cv2
import numpy as np

# 创建一个全0图像
img1 = np.zeros((400, 400, 3), np.uint8)
img2 = np.zeros((400, 400, 3), np.uint8)

# 将两幅图部分变成白色
img1[100:200, 100:200] = [255, 255, 255]
img2[150:250, 150:250] = [255, 255, 255]
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)

# 位运算
img_and = cv2.bitwise_and(img1, img2)
cv2.imshow('img_and', img_and)
img_or = cv2.bitwise_or(img1, img2)
cv2.imshow('img_or', img_or)
img_not = cv2.bitwise_not(img1)
cv2.imshow('img_not', img_not)
img_xor = cv2.bitwise_xor(img1, img2)
cv2.imshow('img_xor', img_xor)



cv2.waitKey(0)

コードの結果は次のようになります。
ここに画像の説明を挿入

3. 画像に透かしを追加する

以下に、画像に透かしを追加する一般的な手順を示します。

  1. リナの写真を紹介します
  2. ロゴを準備するには、自分で作成します
  3. 写真のどこに追加するかを計算し、追加した場所を黒にします
  4. add を使用してロゴと画像を重ね合わせます
import cv2
import numpy as np

img = cv2.imread('./image/lina.jpg')
col, row, chanles = img.shape

# 创建logo
logo = np.zeros((80, 80, 3), np.uint8)
mask1 = np.zeros((80, 80), np.uint8)# 只有一通道,是灰度图
# 画logo
logo[10:40, 10:40] = [0, 0, 255]
logo[30:70, 30:70] = [0, 255, 0]
# 为了将图片中的部分截取下来,把logo的地方给弄黑
mask1[10:40, 10:40] = 255
mask1[30:70, 30:70] = 255
mask1 = cv2.bitwise_not(mask1)
# 截取图像部分
region_img = img[0:80, 0:80]
# 单通道图像与三通道图像运算,智能这样运算。
mask1 = cv2.bitwise_and(region_img, region_img, mask = mask1)

finish_logo = cv2.add(logo, mask1)
# 将处理好的mask1与原图像赋值(添加成功)
img[0:80, 0:80] = finish_logo

cv2.imshow('img', img)
# cv2.imshow('logo', logo)
# cv2.imshow('mask1', mask1)
# cv2.imshow('fin_logo',finish_logo)

cv2.waitKey(0)

図に示すように、左上隅にロゴが追加されます
ここに画像の説明を挿入
以上が画像コンピューティングの基本的なAPIであり、説明が曖昧になることは避けられませんので、ご質問等ございましたらコメント欄にてご議論ください。

おすすめ

転載: blog.csdn.net/weixin_45153969/article/details/130928470