四、图片特效
创始人
2024-02-12 08:02:07

目录

  • 一、灰度处理
  • 二、颜色反转
  • 三、马赛克
  • 四、毛玻璃
  • 五、图片融合
  • 六、边缘检测与浮雕效果
    • 1 - 边缘检测
    • 2 - 浮雕效果
  • 七、颜色映射
  • 八、油画效果

一、灰度处理

  • 使用openCV的imread方法实现
import cv2img0 = cv2.imread('image0.jpg', 0)
img1 = cv2.imread('image0.jpg', 1)
print(img0.shape)
print(img1.shape)
cv2.imshow('src', img0)
cv2.waitKey(0)

在这里插入图片描述

  • 使用openCV的cvtColor方法实现:cvtColor实现颜色空间的转换
import cv2img = cv2.imread('image0.jpg', 1)
dst = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 颜色空间转换 1 data 2 BGR gray
cv2.imshow('dst', dst)
cv2.waitKey(0)
  • 利用R=G=B的方式实现:使用(R+G+B)/ 3 赋值给像素点
import cv2
import numpy as npimg = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# RGB R=G=B = gray  (R+G+B)/3
dst = np.zeros((height, width, 3), np.uint8)
for i in range(0, height):for j in range(0, width):(b, g, r) = img[i, j]gray = (int(b) + int(g) + int(r)) / 3dst[i, j] = np.uint8(gray)
cv2.imshow('dst', dst)
cv2.waitKey(0)
  • 使用心理学公式:r * 0.299 + g * 0.587 + b * 0.114
import cv2
import numpy as npimg = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height, width, 3), np.uint8)
for i in range(0, height):for j in range(0, width):(b, g, r) = img[i, j]b = int(b)g = int(g)r = int(r)gray = r * 0.299 + g * 0.587 + b * 0.114dst[i, j] = np.uint8(gray)
cv2.imshow('dst', dst)
cv2.waitKey(0)
  • 算法优化:浮点数据转换成定点数据;乘除转换成位移计算
    • 这里的系数是按乘以4计算了,如果希望精度更快,可以乘100,1000。。。。。
import cv2
import numpy as npimg = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# RGB R=G=B = gray  (R+G+B)/3
dst = np.zeros((height, width, 3), np.uint8)
for i in range(0, height):for j in range(0, width):(b, g, r) = img[i, j]b = int(b)g = int(g)r = int(r)# 浮点转定点:gray = r * 0.299 + g * 0.587 + b * 0.114# 乘除转位移:gray = (r*1+g*2+b*1)/4gray = (r + (g << 1) + b) >> 2dst[i, j] = np.uint8(gray)
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

二、颜色反转

  • 灰度图片的颜色反转:255-当前的灰度值
import cv2
import numpy as npimg = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = np.zeros((height, width, 1), np.uint8)
for i in range(0, height):for j in range(0, width):grayPixel = gray[i, j]dst[i, j] = 255 - grayPixel
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

  • 彩色图片的颜色反转:255-当前通道的颜色值
import cv2
import numpy as npimg = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height, width, 3), np.uint8)
for i in range(0, height):for j in range(0, width):(b, g, r) = img[i, j]dst[i, j] = (255 - b, 255 - g, 255 - r)
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

三、马赛克

  • 图片实现马赛克的原理:将一片区局域中的所有的像素保持一致
    • 例如:我们想给一个10 * 10的区域打上马赛克
    • 那么我们取到10*10中左上角点的像素值,替换掉10 * 10的100个像素点
    • 这样就实现了马赛克效果
import cv2img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
for m in range(100, 300):for n in range(100, 200):# pixel ->10*10if m % 10 == 0 and n % 10 == 0:for i in range(0, 10):for j in range(0, 10):(b, g, r) = img[m, n]img[i + m, j + n] = (b, g, r)
cv2.imshow('dst', img)
cv2.waitKey(0)

在这里插入图片描述

四、毛玻璃

  • 毛玻璃的实现原理
    • 马赛克效果我们使用的是左上角的像素点来替换掉其他像素点
    • 而毛玻璃是使用随机的像素点来替换掉当前的像素点
import cv2
import numpy as np
import randomimg = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height, width, 3), np.uint8)
mm = 8  # 水平方向上和竖直方向都有可能是8
for m in range(0, height - mm):  # -mm是为了防止矩阵越界,同时这里减了mm,所以生成的时候下方和右方会有很色的边框for n in range(0, width - mm):index = int(random.random() * 8)  # random.random()是0-1,所以index是0-8(b, g, r) = img[m + index, n + index]dst[m, n] = (b, g, r)
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

五、图片融合

  • 2张图片融合的计算公式:dst = src1a+src2(1-a),其中a指的是alpha系数
import cv2img0 = cv2.imread('image0.jpg', 1)
img1 = cv2.imread('image1.jpg', 1)
imgInfo = img0.shape
height = imgInfo[0]
width = imgInfo[1]
# ROI感兴趣范围,这个要比2张图片的范围都小
roiH = int(height / 2)
roiW = int(width / 2)
img0ROI = img0[0:roiH, 0:roiW]
img1ROI = img1[0:roiH, 0:roiW]
# dst
dst = cv2.addWeighted(img0ROI, 0.5, img1ROI, 0.5, 0)  # add src1*a+src2*(1-a)
# 1 src1 2 a 3 src2 4 1-a
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

六、边缘检测与浮雕效果

1 - 边缘检测

  • 什么是边缘检测:边缘检测的效果有点类似素描,边缘检测的实质是图像的卷积计算
  • openCV的API方式实现边缘检测的步骤
    • 灰度处理
    • 高斯滤波
    • canny方法
import cv2img = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src', img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)  # 灰度处理
imgG = cv2.GaussianBlur(gray, (3, 3), 0)  # 高斯滤波
dst = cv2.Canny(img, 50, 50)  # 图片卷积——》th,双阀值
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

  • 源码形式实现边缘检测:sobel算法实现,这里会涉及到如下几个概念
  • sobel算法的算子模板:水平方向、垂直方向
水平方向     垂直方向
[1 2 1          [ 1 0 -10 0 0            2 0 -2
-1 -2 -1 ]        1 0 -1 ]
  • 图片卷积:假设1张图片中的4个像素点为[1 2 3 4],当前的模板是[a b c d],那么卷积的结果:a1+b2+c3+d4 = dst
    • a:竖直方向上的梯度 -> 水平方向上的算子与图片卷积的结果
    • b:水平方向上的梯度 -> 垂直方向上的算子与图片卷积的结果
    • f:阀值,f = sqrt(a * a + b * b)
    • th:判决门限
  • 阀值判决:f > th 是边缘,否则是非边缘
import cv2
import numpy as np
import mathimg = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src', img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = np.zeros((height, width, 1), np.uint8)
for i in range(0, height - 2):for j in range(0, width - 2):gy = gray[i, j] * 1 + gray[i, j + 1] * 2 + gray[i, j + 2] * 1 - gray[i + 2, j] * 1 - gray[i + 2, j + 1] * 2 - \gray[i + 2, j + 2] * 1gx = gray[i, j] + gray[i + 1, j] * 2 + gray[i + 2, j] - gray[i, j + 2] - gray[i + 1, j + 2] * 2 - gray[i + 2, j + 2]grad = math.sqrt(gx * gx + gy * gy)if grad > 50:  # 50为域值dst[i, j] = 255else:dst[i, j] = 0
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

2 - 浮雕效果

  • 浮雕效果计算公式:每一个新的像素值等于相邻像素的像素值之差加上一个恒定值(比如150)
    • newP = gray0 - gray1 + 150
    • 这里加上150是为了增强图片的浮雕灰度等级
    • 相邻像素相减是为了突出灰度的突片及边缘特征
import cv2
import numpy as npimg = cv2.imread('image0.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = np.zeros((height, width, 1), np.uint8)
for i in range(0, height):for j in range(0, width - 1):grayP0 = int(gray[i, j])grayP1 = int(gray[i, j + 1])newP = grayP0 - grayP1 + 150if newP > 255:newP = 255if newP < 0:newP = 0dst[i, j] = newP
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

七、颜色映射

  • 颜色映射最简单的实现方式
    • 做一个很大的查找表,根据原始图像的rgb值根据查找表查找一组新的rgb,用新的rgb代替原来像素值
    • 也可以用一些简单的公式完成颜色映射,利用公式的方法可能无法表示一些更为复杂的效果
  • 案例:蓝色与绿色增强
import cv2
import numpy as npimg = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height, width, 3), np.uint8)
for i in range(0, height):for j in range(0, width):(b, g, r) = img[i, j]b = b * 1.5g = g * 1.3if b > 255:b = 255if g > 255:g = 255dst[i, j] = (b, g, r)
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

八、油画效果

  • 油画效果实现步骤
    • ①.gray 灰度化
    • ②.将图片分割为若干个小方块。统计这些小方块中每个像素的灰度值,比如7 * 7 ,10 * 10
    • ③.将0-255划分段,并将第二步的映射到对应段范围中:如划分4个段,每个段有64个等级。0-63 第1段;64-127第2段
    • ④.例如:这时有一个像素点.灰度值是10,那么他就在0-63这个点
      • 找到每个方块中灰度等级最多的所有像素,count 并求取这些像素的均值
      • 用统计出来的平均值,替代原来的像素值
import cv2
import numpy as npimg = cv2.imread('image0.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = np.zeros((height, width, 3), np.uint8)
# 这里从-4开始,所以边界值要从4开始
for i in range(4, height - 4):for j in range(4, width - 4):array1 = np.zeros(8, np.uint8)for m in range(-4, 4):  # 定义8*8的小方块for n in range(-4, 4):p1 = int(gray[i + m, j + n] / 32)  # 灰度等级划分为8个段,每个为256/8array1[p1] = array1[p1] + 1currentMax = array1[0]l = 0  # 记录是哪个段for k in range(0, 8):  # 求最大值if currentMax < array1[k]:currentMax = array1[k]l = k# 简化 均值for m in range(-4, 4):for n in range(-4, 4):# l是处于哪一个灰度段,32是它的灰度等级# 小于等于下一个灰度段,保证处于范围之内if gray[i + m, j + n] >= (l * 32) and gray[i + m, j + n] <= ((l + 1) * 32):(b, g, r) = img[i + m, j + n]dst[i, j] = (b, g, r)
cv2.imshow('dst', dst)
cv2.waitKey(0)

在这里插入图片描述

相关内容

热门资讯

北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...