OpenCV-02-图像特效及形状绘制

1. 图像的融合:借助addWeighted()函数实现
''' 
注意:
    进行叠加的两张图片宽高应该相同
    叠加之后的像素偏移值如果填的话不要填太大,超过255会导致图像偏白
'''
cv.addWeighted(图像1,权重1,图像2,权重2,叠加之后的像素偏移值)
2. 图像通道的拆分:调用split()函数
result = cv.split(src);  # (255,125,200) split (255) , (125) , (200)  255种灰度  -- 0,255

cv.imshow("Blue",result[0])
cv.imshow("Green",result[1])
cv.imshow("Red",result[2])
3. 彩色图像转灰度图:读入图片时,参数选择如下:
img = cv.imread("img/itheima.jpg",cv.IMREAD_GRAYSCALE)

或者直接调用cvtColor()函数:

gray = cv.cvtColor(src,cv.COLOR_BGR2GRAY)

或者使用gray = (B+G+R)/3公式,简单但效果差,代码如下:

img = cv.imread("img/itheima.jpg",cv.IMREAD_COLOR)

# 获取图片宽高信息
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# 定义一个与原图同样大小的矩阵
dstImg = np.zeros(imgInfo,np.uint8)

# 遍历dstImg,填充数据
for row in range(height):
    for col in range(width):
        # 获取原来的像素值
        (b,g,r) = img[row,col]
        # 计算灰度
        gray = np.uint8((int(b)+int(g)+int(r))/3)
        print(gray)
        # 向目标矩阵中填值
        dstImg[row,col]=gray

cv.imshow("dstimg",dstImg)
cv.waitKey(0)

或者使用Gray = R0.299 + G0.587 + B*0.114,代码如下:

# 采用心理学公式计算
gray = b*0.114 + g*0.587 + r*0.299
4. 颜色翻转,如100->255-100,彩色图也一样,注意维度就行,代码如下:
dstImg = np.zeros((height,width,1),np.uint8)

for row in range(height):
    for col in range(width):
        # 获取原图中的灰度值
        gray = img[row,col]
        # 反转
        newColor = 255 - gray
        # 填充
        dstImg[row,col]=newColor
5. 马赛克的实现:主要思想是扰乱原始数据值,可使用某一值覆盖领域值的方法。
import cv2 as cv
import numpy as np

# 将图片数据读取进来
img = cv.imread("img/itheima.jpg",cv.IMREAD_COLOR)
cv.imshow("img",img)
# 获取原图信息
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# 遍历要打马赛克的区域 宽度430 高度220
for row in range(160,240):
    for col in range(380,670):
        # 每10×10的区域将像素点颜色改成一致
        if row%10==0 and col%10==0:
            # 获取当前颜色值
            (b,g,r) = img[row,col]
            # 将10×10区域内的颜色值改成一致
            for i in range(10):  #这里的10控制马赛克程度,越大越强
                for j in range(10):
                    img[row+i,col+j]= (b,g,r)

# 显示效果图
cv.imshow('dstimg',img)
cv.waitKey(0)
6. 浮雕效果的实现:后一个点的灰度值减去前一个点的灰度值,即求梯度,便可得浮雕效果
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# 将图片转成灰度图片
grayImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 创建一张与原图相同大小的空白矩阵
dstImg = np.zeros((height,width,1),np.uint8)

# 向空白图片中填充内容
for row in range(height):
    for col in range(width-1):
        # 获取当前像素值
        gray0 = grayImg[row,col]
        # 获取相邻一个像素点灰度
        gray1 = grayImg[row,col+1]
        # 计算新的灰度值
        gray = int(gray0)-int(gray1)+120  #让图片更亮一点
        # 校验gray是否越界
        gray = gray if gray<255 else 255
        gray = gray if gray>0 else 0
        # 将值填充到空白的矩阵中
        dstImg[row,col] = gray
7. 毛玻璃效果,就是随机将该点值变换为领域的值,代码如下所示:
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# 创建一个和原图同样大小的空白矩阵
dstImg = np.zeros((height,width,3),np.uint8)

# 定义偏移量,表示从后面6个像素中随机选取一个颜色值
offset=6

# 向空白矩阵中填入颜色值
for row in range(height):
    for col in range(width):
        # 计算随机数
        index = int(random.random()*offset)
        # 计算随机行号
        randomRow = row + index if row+index<height else height-1
        # 计算随机列号
        randomCol = col + index if col+index<width else width-1
        # 选择附近的一个像素点颜色
        (b,g,r) = img[randomRow,randomCol]
        # 填充到空白矩阵中
        dstImg[row,col]=(b,g,r)
8. 形状绘制:直线、矩形、圆形及文字绘制
# 绘制线段 目标图片 起始点 结束点 颜色 线条宽度
cv.line(dstImg,(50,10),(400,10),(255,255,0),10)
# 抗锯齿,放大后使形状更光滑
cv.line(dstImg,(50,50),(400,50),(255,0,0),10,cv.LINE_AA)
# 绘制一个三角形
cv.line(dstImg,(50,350),(150,200),(255,0,0),10)
cv.line(dstImg,(150,200),(300,350),(0,255,0),10)
cv.line(dstImg,(300,350),(50,350),(0,0,255),10)
# 绘制一个矩形 左上角坐标 右下角坐标 颜色 线条宽度,若为负数,则填充整个矩形
cv.rectangle(dstImg,(250,90),(470,180),(0,255,0),-1)
# 绘制圆形 圆心 半径 颜色 线条宽度,若为负数,则填充整个矩形
cv.circle(dstImg,(450,280),90,(0,0,255),5)
# 绘制文字,先加载文字字体
font = cv.FONT_HERSHEY_SIMPLEX
# 文本 显示位置 字体 大小 颜色 粗细 线条类型
cv.putText(img,'www.itheima.com',(395,138),font,1,(0,0,255),2,cv.LINE_AA)
9. 将一张图片贴在另一张图片上,本质还是矩阵操作,将图片A矩阵的值赋值给图片B矩阵即可,代码如下:
for row in range(height):
    for col in range(width):
        img[50+row,100+col]=newLenaImg[row,col]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值