图像处理(三)

边缘检测 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)
Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐