OpenCV:图像特效处理(一)
文章目录
1.灰度处理
1.将
cv2.imread()方法的第二参数设为0即可得到灰色图像
import cv2 import numpy as np img0 = cv2.imread('img.jpg', 0) img1 = cv2.imread('img.jpg', 1) print(img0.shape) print(img1.shape) cv2.imshow('img0', img0) cv2.waitKey(0)
(270, 360) (270, 360, 3)
2.通过
cv2.cvtColor方法对图像进行灰度转换
cv2.cvtColor(src, code, dst, dstCN):
-src: 目标图像 -code: 颜色转换方式 -dst: 图像大小 -dstCN: 颜色通道大小
import cv2 import numpy as np img = cv2.imread('img.jpg', 1) dat = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY ) cv2.imshow('dat', dat) cv2.waitKey(0)
原理
灰色图像的所有颜色通道的值相等,所以要想将彩色图像变为灰色图像,只需将他们颜色通道的值相等即可。
3.下面我们通过源码设置它们的颜色均值来使彩色图像变为灰色图像
import cv2 import numpy as< 20000 /span> np img = cv2.imread('img.jpg', 1) dat = np.zeros((img.shape[0], img.shape[1]), np.uint8) for i in range(0, img.shape[0]): for j in range(0, img.shape[1]): (b, g, r) = img[i, j] gray = (int(b) + int(g) +int(r)) / 3 dat[i, j] = np.uint(gray) cv2.imshow('dat', dat) cv2.waitKey(0)
4.通过设置
gray = r * 0.299 + g * 0.587 + b * 0.114来变为灰色图像
import cv2 import numpy as np img = cv2.imread('img.jpg', 1) dat = np.zeros((img.shape[0], img.shape[1]), np.uint8) for i in range(0, img.shape[0]): for j in range(0, img.shape[1]): (b, g, r) = img[i, j] gray = int(b) * 0.114 + int(g) * 0.587 +int(r) * 0.299 dat[i, j] = np.uint(gray) cv2.imshow('dat', dat) cv2.waitKey(0)
2.颜色反转
将图像的颜色反转也就是让255减去当前的颜色值
下面我们来实现灰色图像的颜色反转:
import cv2 import numpy as np img = cv2.imread('img.jpg', 1) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) dat = np.zeros((img.shape[0], img.shape[1]), np.uint8) for i in range(gray.shape[0]): for j in range(gray.shape[1]): dat[i, j] = 255 - gray[i, j] cv2.imshow('dat', dat) cv2.waitKey(0)
彩色图像的颜色反转也是一样的道理:
import cv2 import numpy as np img = cv2.imread('img.jpg', 1) dat = np.zeros((img.shape[0], img.shape[1], img.shape[2]), np.uint8) for i in range(img.shape[0]): for j in range(img.shape[1]): (b, g, r) = img[i, j] dat[i, j] = (255 - b, 255 - g, 255 - r) cv2.imshow('src', img) cv2.imshow('dat', dat) cv2.waitKey(0)
3.马赛克
原理: 取一个指定大小的窗口,将该窗口填充为一个颜色
下面我们将窗口设置为
10*10来生成一个马赛克图像
import cv2 import numpy as np img = cv2.imread('img.jpg', 1) height = img.shape[0] width = img.shape[1] for m in range(50, 150): for n in range(100, 200): if m % 10 == 0 and n % 10 == 0: for i in range(10): for j in range(10): (b, g,r) = img[m, n] img[m + i, n + j] = (b, g, r) cv2.imshow('img', img) cv2.waitKey(0)
4.毛玻璃效果
原理: 将当前的像素颜色随机设置为窗口中的一个颜色
这里我们设置窗口为
8*8来生成一个毛玻璃图像
import cv2 import random import numpy as np img = cv2.imread('img.jpg', 1) height = img.shape[0] width = img.shape[1] dat = np.zeros(img.shape, np.uint8) for m in range(height - 8): for n in range(width - 8): index = int(random.random() * 8) (b, g, r) = img[m + index, n + index] dat[m, n] = (b, g, r) cv2.imshow('dat', dat) cv2.waitKey(0)
5.图像融合
图片乘以比例系数相加得到俩张图片的融合效果:
target = src1 * a +src2 * (1 - a)
cv2.addWeighted(src1, alpha, src2, beta, gamma):
-src1: 第一张图像 -alpha: 第一张图像的权重 -src2: 第二张图像 -beta: 第二张图像的权重 -gamma: 要添加的标量
import cv2 import numpy as np img1 = cv2.imread('img3.jpg', 1) img2 = cv2.imread("img2.png", 1) dat = np.zeros(img1.shape, np.uint8) dat = cv2.addWeighted(img1, 0.5, img2, 0.5, 0) cv2.imshow('dat', dat) cv2.waitKey(0)
7.边缘检测
canny
边缘检测:
首先,图像降噪。我们知道梯度算子可以用于增强图像,本质上是通过增强边缘轮廓来实现的,也就是说是可以检测到边缘的。但是,它们受噪声的影响都很大。那么,我们第一步就是想到要先去除噪声,因为噪声就是灰度变化很大的地方,所以容易被识别为伪边缘。
第二步,计算图像梯度,得到可能边缘。计算图像梯度能够得到图像的边缘,因为梯度是灰度变化明显的地方,而边缘也是灰度变化明显的地方。当然这一步只能得到可能的边缘。因为灰度变化的地方可能是边缘,也可能不是边缘。这一步就有了所有可能是边缘的集合。
第三步,非极大值抑制。通常灰度变化的地方都比较集中,将局部范围内的梯度方向上,灰度变化最大的保留下来,其它的不保留,这样可以剔除掉一大部分的点。将有多个像素宽的边缘变成一个单像素宽的边缘。即“胖边缘”变成“瘦边缘”。
第四步,双阈值筛选。通过非极大值抑制后,仍然有很多的可能边缘点,进一步的设置一个双阈值,即低阈值(low),高阈值(high)。灰度变化大于high的,设置为强边缘像素,低于low的,剔除。在low和high之间的设置为弱边缘。进一步判断,如果其领域内有强边缘像素,保留,如果没有,剔除。
这样做的目的是只保留强边缘轮廓的话,有些边缘可能不闭合,需要从满足low和high之间的点进行补充,使得边缘尽可能的闭合。
import cv2 import numpy import random img = cv2.imread('img.jpg', 1) cv2.imshow('src', img) # canny 1 gray 2 高斯 3 canny gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) imgG = cv2.GaussianBlur(gray, (3,3), 0) dat = cv2.Canny(img, 50, 50) cv2.imshow('dat', dat) cv2.waitKey(0)
sobel算子:
利用Sobel算子对图像的每一个像素进行卷积运算得到图像梯度( x 方向和 y 方向),我们可以通过计算
sqrt(a**2 + b**2)来得到
梯度幅值(其中 a 和 b 分别为水平方向的梯度和竖直方向的梯度),判断该值是否大于判决门限,如果大于则认为是边缘
下面我们用源码来实现:
import cv2 import math import numpy as np import random img = cv2.imread('img.jpg', 1) cv2.imshow('src', img) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转换为灰色图像 dat = np.zeros((img.shape[0], img.shape[1], 1), np.uint8) #生成空模板 for i in range(img.shape[0] - 2): for j in range(img.shape[1] - 2): # 求梯度 gy = gray[i, j] + gray[i, j + 1] * 2 + gray[i,j + 2] - (gray[i + 2, j] + gray[i + 2, j + 1] * 2 + gray[i + 2, j + 2]) gx = 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: # 判断是否为边缘 dat[i, j] = 255 else: dat[i, j] = 0 cv2.imshow('dat', dat) cv2.waitKey(0)
- C++ OpenCV图像特效处理(剪影/怀旧/浮雕/国画/彩虹/素描特效)
- 图像处理大作业之门牌号码识别大作业 opencv 版本
- ANDROID实战经验之图像处理及特效处理的集锦(总结版)
- python+opencv图像处理(五)——图像缩放、旋转、翻转、平移
- opencv图像处理学习(四十九)——局部二值模式LBP
- 图像处理之老照片特效
- opencv图像处理教程C++(五)图像基本操作
- 【第二部分 图像处理】第4章 Opencv图像处理高阶【1马赛克】
- Android中几种图像特效处理
- 图像处理之基础---基于opencv的灰度图像微分
- opencv图像处理学习(五十三)——ROI设置
- opencv3 图像处理(一)图像缩放( python与c++ 实现)
- OpenCV-图像处理(25、直方图比较)
- Python 图像处理 OpenCV (14):图像金字塔
- 图像处理基础(二)_OpenCV命名规则
- 初学图像处理+opencv----跟踪视频中运动物体
- Python OpenCV学习笔记之:图像轮廓处理
- 【OpenCV 图像轮廓处理函数】
- VS+QT+OpenCV图像处理输出
- Win8 Metro(C#)数字图像处理--2.73一种背景图像融合特效