图像处理(三)
图像处理(三)边缘检测 sobel实现方式一直接调用API注意事项边缘检测是基于灰度图像import cv2import numpy as npimport randomimg=cv2.imread('image1.jpg',1)imginfo=img.shapeheight=imginfo[0]width=imginfo[1]cv2.imshow('src',im...
·
图像处理(三)
边缘检测 sobel
实现方式一 直接调用API
注意事项 边缘检测是基于灰度图像
import cv2
import numpy as np
import random
img=cv2.imread('image1.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) # 50,50 是设置的阈值 图像卷积大于阈值用255 小于时是0
cv2.imshow('dst',dst)
cv2.waitKey(0)
实现 二
sobel算子 代码方式
前提知识
sobel算子
[1 2 1 [ 1 0 -1
0 0 0 2 0 -2
-1 -2 -1 ] 1 0 -1]
图片卷积 对应相乘再相加
[a b c d] [1 2 3 4] =a1+b2+c3+d4
梯度方向 sqrt(aa+bb)
import cv2
import numpy as np
import random
import math
img=cv2.imread('image1.jpg',1)
imginfo=img.shape
height=imginfo[0]
width=imginfo[1]
cv2.imshow('src',img)
# sobel 1 算子模板 2 图片卷积 3 阈值判决
# 竖直 [ 1 2 1 水平 [ 1 0 -1
# 0 0 0 2 0 -2
# -1 -2 -1] 1 0 -1]
#[1 2 3 4 ] [a b c d] =a*1+b*2+c*3+d*4 =dst
#梯度方向 sqrt(a*a+b*b) =f(幅值) > th
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]*1
gx=gray[i,j]*1+gray[i+1,j]*2+gray[i+2,j]*1-gray[i,j+2]*1-gray[i+1,j+2]*2-gray[i+2,j+2]*1
grad=math.sqrt(gx*gx+gy*gy)
if grad>50:
dst[i,j]=255
else:
dst[i,j]=0
cv2.imshow('dst',dst)
cv2.waitKey(0)
浮雕效果
浮雕和边缘检测实现方法类似
newp=gray0-gray1+150
相邻两像素的差值加上一个常数
#浮雕效果
import cv2
import numpy as np
import random
import math
img=cv2.imread('image1.jpg',1)
imginfo=img.shape
height=imginfo[0]
width=imginfo[1]
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# newp=gray0-gray1+150
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=grayp1-grayp0+50
if newp>255:
newp=255
if newp<0:
newp=0
dst[i,j]=newp
cv2.imshow('dst',dst)
cv2.waitKey(0)
颜色风格 简化版
import cv2
import numpy as np
import random
import math
img=cv2.imread('image1.jpg',1)
imginfo=img.shape
height=imginfo[0]
width=imginfo[1]
# 部分颜色增强 b = b*1.5 g = g *1.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=b*1.5
g=g*1.3
if b>255:
b=255
if g>255:
g=255
dst[i,j]=(b,g,r)
cv2.imshow('dst',dst)
cv2.waitKey(0)
油画特效
1 彩色图片转化成灰度
2 划分若干小块 7*7
3 将 0-255 划分为不同的等级
4 求方块中灰度等级最多的像素,并求该像素的平均值
5 用4中均值代替原来的像素
import cv2
import numpy as np
img=cv2.imread('image.jpg',1)
imginfo=img.shape
height=imginfo[0]
width=imginfo[1]
gray=cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
dst=np.zeros((height,width,3),np.uint8)
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):
for n in range(-4,4):
p1=int(gray[i+m,j+n]/32)
array1[p1]=array1[p1]+1
currentMax=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):
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)
绘制线段、圆形、矩形、多边形
import cv2
import numpy as np
newimageinfo=(500,500,3) # 定义一个远祖 描述图片的信息
dst=np.zeros(newimageinfo,np.uint8)
# line 绘制线段 1 dst 2 起始位置 3 终止位置 4 颜色 (b,g,r)5 线条宽度 6 线条类型
cv2.line(dst,(100,100),(400,400),(0,0,255))
cv2.line(dst,(100,200),(400,200),(0,255,255),20)
cv2.line(dst,(100,300),(400,300),(0,255,0),20,cv2.LINE_AA)
# 绘制三角形、
cv2.line(dst,(200,150),(50,250),(0,0,255))
cv2.line(dst,(50,250),(400,380),(0,0,255))
cv2.line(dst,(400,380),(200,150),(0,0,255))
cv2.imshow('dst',dst)
cv2.waitKey(0)
import cv2
import numpy as np
newimageinfo=(500,500,3)
dst=np.zeros(newimageinfo,np.uint8)
# 绘制矩形 1 dst 2 左上角 3 右下角 4 颜色 5 是否填充 -1 填充,若不为-1 而是大于0的代指线条宽度
cv2.rectangle(dst,(50,100),(200,300),(255,0,0),-1)
# 绘制圆形 1 dst 2 圆心 3 半径 R 4 颜色 5 填充 0 线条宽度
cv2.circle(dst,(250,250),(50),(255,0,0),2)
#绘制椭圆 1 dst 2 椭圆圆心 3 轴长 4 偏转角度 5 起始角度 6 终止角度 7 颜色 8 填充
cv2.ellipse(dst,(300,300),(150,100),0,0,180,(255,0,0),-1)
#多边形绘制
points=np.array([[100,150],[200,300],[340,180],[420,180]],np.int32)
points=points.reshape((-1,1,2))
cv2.polylines(dst,[points],True,(0,255,255))
cv2.imshow('dst',dst)
cv2.waitKey(0)
添加文字
# 文字绘制
import cv2
import numpy as np
img=cv2.imread('image1.jpg',1)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.rectangle(img,(200,100),(500,400),(0,255,0),3)
# 1 dst 2 添加内容 3 起始位置 4 字体 5 字体大小 6 颜色 7 粗细 8 线条类型
cv2.putText(img,'this is flow',(300,100),font,1,(2555,0,0),2,cv2.LINE_AA)
cv2.imshow('src',img)
cv2.waitKey(0)
添加图片
# 文字绘制
import cv2
import numpy as np
img=cv2.imread('image1.jpg',1)
font=cv2.FONT_HERSHEY_SIMPLEX
cv2.rectangle(img,(200,100),(500,400),(0,255,0),3)
# 1 dst 2 添加内容 3 起始位置 4 字体 5 字体大小 6 颜色 7 粗细 8 线条类型
cv2.putText(img,'this is flow',(300,100),font,1,(2555,0,0),2,cv2.LINE_AA)
cv2.imshow('src',img)
cv2.waitKey(0)
更多推荐
已为社区贡献1条内容
所有评论(0)