Skip to content

Latest commit

 

History

History
232 lines (172 loc) · 4.89 KB

625-1189961-图像的数学运算.sy.md

File metadata and controls

232 lines (172 loc) · 4.89 KB
show version enable_checker
step
1.0
true

opencv

回忆

  • 上次研究了键盘互动的效果
  • 写字效果
    • 感觉可以做一个打字练习器
  • 下次玩点什么呢?

图像的加法

import cv2            
img = cv2.imread("monkey.png")
sum1 = img + img         
cv2.imshow("sum1",sum1)
sum2= cv2.add(img,img)
cv2.imshow("sum2",sum2)                                                       cv2.waitKey()            
cv2.destroyAllWindows()
  • 结果

图片描述

运算法 溢出处理
直接+法 溢出后 取模
add加法 溢出后 等于255

模拟三色光

import cv2
import numpy as np
 
blue = np.zeros((150,150,3),np.uint8)
blue[:,:,0] = 255
green = np.zeros((150,150,3),np.uint8)
green[:,:,1] = 255
red = np.zeros((150,150,3),np.uint8)
red[:,:,2] = 255
 
cv2.imshow("blue",blue)
cv2.imshow("green",green)
cv2.imshow("red",red)
 
cyan = cv2.add(blue,green)
cv2.imshow("cyan",cyan)
 
white = cv2.add(cyan,red)
cv2.imshow("white",white)
                                                                             
cv2.waitKey()
cv2.destroyAllWindows()
  • 加色混色法
    • 对应RGB的色彩模式

图片描述

  • 可以做三原色图那样的图像吗?

径向渐变

import cv2
import numpy as np

red  = np.zeros((300,300),np.uint8)
green  = np.zeros((300,300),np.uint8)
blue  = np.zeros((300,300),np.uint8)

def draw_gradient(pos_x,pos_y,radius,image):
    for x in range(0,300):
        for y in range(300):
            color = 255 - int(((y-pos_y)**2 + (x-pos_x)**2)**0.5/(radius*2**0.5)*255)
            image[y,x] = color

draw_gradient(100,100,80,red)
cv2.imshow("red",red)
draw_gradient(200,100,80,green)
draw_gradient(150,105,80,blue)
rgb = cv2.merge([blue,green,red])
cv2.imshow("rgb",rgb)
key = cv2.waitKey(0)
  • 画面 挺好看

图片描述

  • 不过不符合要求

rgb三个方向

import cv2
import numpy as np

red  = np.zeros((300,300),np.uint8)
green  = np.zeros((300,300),np.uint8)
blue  = np.zeros((300,300),np.uint8)
black  = np.zeros((300,300),np.uint8)

def draw_gradient(pos_x,pos_y,radius,image):
    for x in range(0,300):
        for y in range(300):
            dx = abs(x - pos_x)
            dy = abs(y - pos_y)
            dis = (dy**2 + dx**2) ** 0.5
            if dis < radius:
                color = dis / radius * 255
                color = 255 - int(color)
                image[y,x] = color

draw_gradient(100,100,200,red)
draw_gradient(200,100,200,green)
draw_gradient(150,200,200,blue)
red_channel = cv2.merge([blue,black,black])
cv2.imshow("red_channel",red_channel)
r_b = cv2.merge([blue,green,black])
cv2.imshow("r_b",r_b)
rgb = cv2.merge([blue,green,red])
cv2.imshow("rgb",rgb)
key = cv2.waitKey(0)
  • 最终效果

图片描述

  • 不同图像之间可以混合吗?

按照不透明度权重混合

#encoding:utf-8
import cv2
import numpy as np
import matplotlib.pyplot as plt

#读取图片
src1 = cv2.imread("lena.png")
src2 = cv2.imread("monkey.png")
rows,cols = src2.shape[:2]
print(rows,cols)
src1 = src1[0:rows,0:cols,]
print(src1.shape)

#图像融合
#result = cv2.addWeighted(src1, 1, src2, 1, 0)
result = cv2.addWeighted(src1, 0.6, src2, 0.8, 10)

#显示图像
cv2.imshow("src1", src1)
cv2.imshow("src2", src2)
cv2.imshow("result", result)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
  • 混合结果

图片描述

图层混合方式

  • 三个主要方向
    1. 变亮
    2. 变暗
    3. 强化对比
      • 亮得更亮/暗得更暗

图片描述

对照

  • 其中
    • 变亮 和 变暗两套
    • 可以彼此对照

图片描述

  • 都有相应的 算法

乘法和加法

  • multiply
    • 正片叠底
      • 200 ➗ 255 = 0.78
      • 72 ➗ 255 = 0.28
    • 0.22 会比原来变暗

图片描述

  • 相加模式
    • 两者亮度值 直接相加
    • 超过255 超过1
    • 产生溢出
    • 显示为 纯白色

变亮 和 变暗的细节

  • 具体细节

图片描述

总结 🤔

  • 这次研究了 两个矩阵的加法
运算法 溢出处理
直接+法 溢出后 取模
add加法 溢出后 等于255
  • BGR 三个通道混合的时候
    • 用的就是 加色混色法
  • 除了 加减运算之外
    • 图像 还有什么 运算方式吗?🤔
  • 下次再说👋