import cv2 as cv
from pylab import *
import matplotlib.pyplot as plt
import random
from scipy import ndimage
import numpy
# .......................................................................................
# ..................................我是分界线.............................................
# .......................................................................................
def LaplaceOperator(roi):
laplace_operator = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
result = np.abs(np.sum(roi * laplace_operator)) # 3阶矩阵相乘并求和取绝对值
return result
def LaplaceAlogrithm(image):
new_image = np.zeros(image.shape) # 返回来一个给定形状和类型的用0填充的数组,用于储存新图像
image = cv.copyMakeBorder(image, 1, 1, 1, 1, cv.BORDER_DEFAULT) # 为图片设置边界框
# image.shape[0]图片垂直尺寸;image.shape[1]图片水平尺寸;image.shape[2]图片通道数
for i in range(1, image.shape[0] - 1):
for j in range(1, image.shape[1] - 1):
new_image[i - 1, j - 1] = LaplaceOperator(image[i - 1:i + 2, j - 1:j + 2])
# 上面这个for循环 是 拿出3x3的图像像素与卷积核相乘,然后存放到个新的数组中
new_image = new_image * (255 / np.max(image)) # 防止有灰度值超过255这个数值
return new_image.astype(np.uint8) # 转换数组的数据类型
# .......................................................................................
# ..................................我是分界线.............................................
# .......................................................................................
def pepper_and_salt(img,percentage):
num=int(percentage*img.shape[0]*img.shape[1])# 椒盐噪声点数量
random.randint(0, img.shape[0])
img2=img.copy()
for i in range(num):
X=random.randint( 0,img2.shape[0]-1) #从0到图像长度之间的一个随机整数,因为是闭区间所以-1
Y=random.randint( 0,img2.shape[1]-1)
if random.randint(0,1) ==0: #黑白色概率55开
img2[X,Y] = (255,255,255) #白色
else:
img2[X,Y] =(0,0,0)#黑色
return img2
# ..................................我是分界线.............................................
if __name__ == '__main__':
plt.ion() #人机交互界面启动
# 读取图片
img = cv.imread("g11.tif")
# 使用3*3的Sobel算子进行图像锐化
x = cv.Sobel(img, cv.CV_16S, 1, 0) # 1,0表示计算X方向的导数
y = cv.Sobel(img, cv.CV_16S, 0, 1) # 1,0表示计算Y方向的导数
#cv.CV_16S表示图像深度,这是为了防止溢出,当输入图像是8位的,要求输出图像是16位的
absX = cv.convertScaleAbs(x) # 转回uint8
absX = cv.addWeighted(absX, 0.5, img, 0.5, 0) # 将原图与sobel算法(X轴求导)处理过的图片结果相加
absY = cv.convertScaleAbs(y) # 转回uint8
absY = cv.addWeighted(absY, 0.5, img, 0.5, 0) # 将原图与sobel算法(Y轴求导)处理过的图片结果相加
dst = cv.addWeighted(absX, 0.5, img, 0.5, 0) # 将sobel算法(对X求导)(对Y求导)处理过的图片相加
dst = cv.addWeighted(dst , 0.5, img, 0.5, 0) # 将原图和上一段代码生成的图片相加
htitch = np.hstack((absX,absY,dst)) # 合并3张图片
cv.imshow("absX-absY-dst", htitch) # 图片显示
cv.waitKey(0)
cv.destroyAllWindows()
# 使用3*3的Laplacian算子进行图像锐化
img = cv.imread("g13.tif") # 导入图片
plt.subplot() # 生成一个用于图片显示的窗口
plt.title("Laplacian") # 标题
plt.imshow(LaplaceAlogrithm(img)) # 对图像调用函数先进行拉普拉斯变换后显示
plt.pause(3) # 延时三秒
plt.close() # 清空窗口
dst = cv.addWeighted(LaplaceAlogrithm(img), 0.5, img, 0.5, 0) # 将原图和拉普拉斯变换生成的图片相加
cv.imshow("over", dst) # 图片显示
cv.waitKey(5000) # 图片显示延时5000帧
# 使用3*3的高通滤波算子进行图像锐化
img = cv.imread("g14.tif") # 导入图片
kernel = np.array([[0, -2, 0], [-2, 9, -2], [0, -2, 0]]) # 生成二维梯度模板矩阵
gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) # 将图片变为CV格式的灰度图,我这不加这句话会报错
G14 = cv.filter2D(gray,-1,kernel) # gray表示输入图像;-1表示目标图像和原图像深度保持一致;kernel为卷积核
dst = cv.addWeighted(gray, 0.5, G14, 0.5, 0) # 将高通滤波后的图与原图叠加
cv.imshow("gaotong", G14) # 显示高通滤波后的图片
cv.imshow("over", dst) # 显示叠加后的图
cv.waitKey()
|