图像处理(二)

1、图像剪切

#图片剪切
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
dst = img[100:200,100:300]  #x:100->200 y:100->300
cv2.imshow('dst',dst)
cv2.waitKey(0)

2、图像缩放

#图像缩放:1、读取图片 2、获取图片长宽 3、缩放图片
#调用cv2.resize(原始图像,(缩放图像高度,缩放图像宽度))
import cv2
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
print(imgInfo)
height = imgInfo[0]
width = imgInfo[1]
print(height,width)

dstHeight = int(height*0.5)
dstWidth = int(width*0.5)
print(dstHeight,dstWidth)
#图片缩放:最近插值邻域插值、双线性插值、像素关系重采样、立方插值
dstimg = cv2.resize(img,(dstWidth,dstHeight))
cv2.imshow('image',dstimg)
cv2.waitKey(0)```

```python
#最近邻域插值算法原理
#scri = dsti*(scrheight/dstheight)
#scrj = dstj*(scrwidth/dstwidth)  可以将dswidth移到左边看起来比较清楚
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dstHeight = int(height/2)
dstWidth = int(width/2)
dstImg = np.zeros([dstHeight,dstWidth,3],np.uint8)#目标图像模板

for i in range(0,dstHeight):
    for j in range(0,dstWidth):
        iNew = int(i*(height*1.0/dstHeight))
        jNew = int(j*(width*1.0/dstWidth))
        dstImg[i,j] = img[iNew,jNew]
cv2.imshow('yss',dstImg)
cv2.waitKey(0)
#移位矩阵matshift+仿射warpAffine实现缩放
#改变移位矩阵的系数

import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
h = imgInfo[0]
w = imgInfo[1]

matshift = np.float32([[0.5,0,0],[0,0.5,0]])
dstImg = cv2.warpAffine(img,matshift,(h,w),borderValue=(155,150,200))

cv2.imshow('dst',dstImg)
cv2.waitKey(0)

3、图像移位

import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape

h = imgInfo[0]
w = imgInfo[1]

# 移位矩阵
#warpAffine原理:[1,0   * [x   + [100   = [x+100
                 0,1]     y]     200]     y+200]
matShift = np.float32([[1,0,100],[0,1,200]])
dst = cv2.warpAffine(img,matShift,(h,w))

cv2.imshow('dst',dst)
cv2.waitKey(0)

4、图像毛玻璃

#图像毛玻璃:用这个点周围的随机点替换当前像素点
import cv2
import numpy as np
import random
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

mm=8
for i in range(0,height-mm):
    for j in range(0,width-mm):
        index = int(random.random()*8) #这里必须转化为int类型
        (b,g,r) = img[i+index,j+index]
        img[i,j] = (b,g,r)
cv2.imshow('img',img)
cv2.waitKey(0)

5、图像灰度处理

#图像灰度处理(1)  RGB->GRAY
import cv2
img = cv2.imread('image0.jpg',0)
print(img.shape)
#图像灰度处理(2):cv2.cvtColor(原始图像,转换方法)
import cv2
img = cv2.imread('image0.jpg',1)
dst = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
cv2.imshow('dst',dst)
cv2.waitKey(0)```

```python
#图像灰度处理(3):(b+g+r)/3
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width),np.uint8)

# (b1,g1,r1) = img[1,2]
# print(b1,g1,r1)
# print((b1+g1+r1)/3)
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 = (b+g+r)/3
        dst[i,j] = gray         #为什么这里可以直接赋值gray,而不是使用元组(gray,gray,gray)赋值
cv2.imshow('dst',dst)           #直接赋值gray,相当于元组中的三个值都是gray
cv2.waitKey(0)
#图像灰度处理(4):gray = r*0.299+g*0.587+b*0.114
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height,width),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
        dst[i,j] = gray         
cv2.imshow('dst',dst)
cv2.waitKey(0)
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
(b1,g1,r1) = img[1,2]
print(b1,g1,r1)
gray = (b1+g1+r1)/3
img[1,2] = gray
(b2,g2,r2) = img[1,2]
print(b2,g2,r2)

6、图像旋转

#图片旋转
#1、matRotate(旋转矩阵)=cv2.getRotationMatrix2D(旋转位置,角度,缩放系数)
#2、cv2.warpAffine(原始图像,matRotate,(h,w))```

```python
#图片旋转
#1、matRotate(旋转矩阵)=cv2.getRotationMatrix2D(旋转位置,角度,缩放系数)
#2、cv2.warpAffine(原始图像,matRotate,(h,w))

7、图像镜像

#图像镜像:width不变,height*2
#1、定义一个新的图像模板(height*2,width,deep)
#2、先打印新图上半部分=原始图像
#3、新图下部分=原始图像反转(y=i*2-1-i)  i:heigth
import cv2 
import numpy as np
img = cv2.imread('image0.jpg',1)
cv2.imshow('src',img)
imgInfo = img.shape
h = imgInfo[0]
w = imgInfo[1]
d = imgInfo[2]
newImgInfo = (h*2,w,d)
dst = np.zeros(newImgInfo,np.uint8)
#打印镜像后整张图片
for i in range(0,h):
    for j in range(0,w):
        dst[i,j] = img[i,j]
        dst[h*2-i-1,j] = img[i,j]
#打印中间分割线
for i in range(0,w):
    dst[h,i]=(0,0,255)
    
cv2.imshow('dst',dst)
cv2.waitKey(0)

8、图像融合

#图片融合:选取两幅图片中的区域进行融合
# dst = scr1*a+src*(1-a)
import cv2 
import numpy as np
img0 = cv2.imread('image0.jpg',1)
img1 = cv2.imread('image1.jpg',1)
imgInfo = img0.shape
height = imgInfo[0]
width = imgInfo[1]
#ROI 需要融合的区域
roiH = int(height/2)
roiW = int(width/2)
img0ROI = img0[0:roiH,0:roiW]
img1ROI = img1[0:roiH,0:roiW]
#dst
dst = np.zeros((roiH,roiW,3),np.uint8)
#cv2.addWeighted(融合图像1,a系数,融合图像2,1-a,0)
dst = cv2.addWeighted(img0ROI,0.8,img1ROI,0.2,0)
cv2.imshow('dst',dst)
cv2.waitKey(0)

9、图像颜色反转

#图像颜色反转(灰度):255-gray
import cv2
import numpy as np
img = 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,3),np.uint8) 
for i in range(0,height):
    for j in range(0,width):
        grayPiexl = gray[i,j]
        dst[i,j] = 255-grayPiexl
cv2.imshow('dst',dst)
cv2.waitKey(0)
#图像颜色反转(彩色):255-r,255-g,255-b
import cv2
import numpy as np
img = 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、图像马赛克

#图像马赛克:将一个像素点的值替换到一像素块中
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

for i in range(100,300):
    for j in range(100,200):
        if i%10==0 and j%10==0:
            for m in range(0,10):
                for n in range(0,10):
                    (b,g,r) = img[i,j]
                    img[m+i,n+j] = (b,g,r)
cv2.imshow('img',img)
cv2.waitKey(0)

11、图像修补

#图像修补
import cv2
import numpy as np
img = cv2.imread('image0.jpg',1)
for i in range(200,300):
    img[i,200] = (255,255,255)
    img[i,200+1] = (255,255,255)
    img[i,200-1] = (255,255,255)
for i in range(150,250):
    img[250,i] = (255,255,255)
    img[250+1,i] = (255,255,255)
    img[250-1,i] = (255,255,255)    
cv2.imwrite('damaged.jpg',img)
cv2.imshow('image',img)
cv2.waitKey(0)
#图像修补
#1、先读取受损图像 2、找出掩图 3、cv2.inpaint()进行修复
import cv2
import numpy as np
img = cv2.imread('damaged.jpg',1)
cv2.imshow('img',img)
height = img.shape[0]
width = img.shape[1]
paint = np.zeros((height,width,1),np.uint8)

for i in range(200,300):
    paint[i,200] = 255
    paint[i,200+1] = 255
    paint[i,200-1] = 255
for i in range(150,250):
    paint[250,i] = 255
    paint[250+1,i] = 255
    paint[250-1,i] = 255   
cv2.imshow('paint',paint)
#1、受损图像 2、掩图(修复区域为得非零区域,修补像素半径,修复模式)
imgDst = cv2.inpaint(img,paint,3,cv2.INPAINT_TELEA)
cv2.imshow('image',imgDst)
cv2.waitKey(0)
#图像修补
#1、先读取受损图像 2、找出掩图 3、cv2.inpaint()进行修复
import cv2
import numpy as np
img = cv2.imread('damaged.jpg',1)
cv2.imshow('img',img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 二值化
ret, binary = cv2.threshold(gray, 245, 255, cv2.THRESH_BINARY)
cv2.imshow('image',binary)

#修复
dstImg = cv2.inpaint(img,binary,3,cv2.INPAINT_TELEA)
cv2.imshow('dst',dstImg)
cv2.waitKey(0)
#图像修补新图
#1、先读取受损图像 2、找出掩图 3、cv2.inpaint()进行修复
import cv2
import numpy as np
img = cv2.imread('image00.jpg',1)
cv2.imshow('img',img)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

# 二值化
ret, binary = cv2.threshold(gray, 245, 255, cv2.THRESH_BINARY)
cv2.imshow('image',binary)
# 进行开操作,去除噪音小点。
kernel_3X3 = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
binary_after_open = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel_3X3)

#修复
dstImg = cv2.inpaint(img,binary,3,cv2.INPAINT_TELEA)
cv2.imshow('dst',dstImg)
cv2.waitKey(0)

12、图像边缘检测

#图像边缘检测:1、gray 2、高斯 3、Canny
import cv2
import numpy as np
import random
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('img',img)

gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
imgG = cv2.GaussianBlur(gray,(3,3),0) #高斯滤波:1、滤波灰度图像 2、滤波算子 3、
dst = cv2.Canny(img,50,50)  #1、原始图片 2、门限值 3、门限值
cv2.imshow('dst',dst)
cv2.waitKey(0)
#图片边缘检测实现原理 sober算子
'''[1,2,1            [1 0 -1
    0,0,0             2 0 -2
   -1,-2,-1]          1 0 -1]
   竖直矩阵            水平矩阵
用算子中的元素对应乘以相同大小的像素块
'''

import cv2
import numpy as np
import math
img = cv2.imread('image0.jpg',1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src',img)
dst = np.zeros((height,width),np.uint8)
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
for i in range(0,height-2):                      #算子模板3*3 防止矩阵越界-2
    for j in range(0,width-2):
        y = 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
        x = gray[i,j]*1-gray[i,j+2]*1+gray[i+1,j]*2
        -gray[i+1,j+2]*2+gray[i+2,j]*1-gray[i+2,j+2]*1
        grad = math.sqrt(x*x+y*y)            #grad为梯度,如果grad > 门限值50,则认为是边缘
        if grad>50:
            dst[i,j] = 255
        else:
            dst[i,j]=0
cv2.imshow('dst',dst)
cv2.waitKey(0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值