|
|
import math
|
|
|
|
|
|
import cv2
|
|
|
import numpy as np
|
|
|
|
|
|
####################灰度图和二值化########################################
|
|
|
|
|
|
|
|
|
|
|
|
def gray_picture(img):
|
|
|
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
|
|
|
return img_gray
|
|
|
|
|
|
def erzhihua(image):
|
|
|
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
|
|
|
rst = cv2.threshold(image, 127, 255, cv2.THRESH_BINARY)
|
|
|
return rst[1]
|
|
|
|
|
|
##################加噪###########################################################
|
|
|
def add_noisy(image, snr): #椒盐彩色
|
|
|
result = image.copy()
|
|
|
size = result.size
|
|
|
n1= int(size*(1-snr))
|
|
|
print(n1)
|
|
|
w, h = image.shape[:2]
|
|
|
for i in range(n1):
|
|
|
# 宽和高的范围内生成一个随机值,模拟表x,y坐标
|
|
|
x = np.random.randint(1, w)
|
|
|
y = np.random.randint(1, h)
|
|
|
if np.random.randint(0, 2) == 0:
|
|
|
# 生成白色噪声(盐噪声)
|
|
|
result[x, y] = 0
|
|
|
else:
|
|
|
# 生成黑色噪声(椒噪声)
|
|
|
result[x, y] = 255
|
|
|
return result
|
|
|
|
|
|
"""
|
|
|
def add_noisy(image, n): #椒盐彩色
|
|
|
result = image.copy()
|
|
|
size = result.size
|
|
|
n= int(n)
|
|
|
w, h = image.shape[:2]
|
|
|
for i in range(n):
|
|
|
# 宽和高的范围内生成一个随机值,模拟表x,y坐标
|
|
|
x = np.random.randint(1, w)
|
|
|
y = np.random.randint(1, h)
|
|
|
if np.random.randint(0, 2) == 0:
|
|
|
# 生成白色噪声(盐噪声)
|
|
|
result[x, y] = 0
|
|
|
else:
|
|
|
# 生成黑色噪声(椒噪声)
|
|
|
result[x, y] = 255
|
|
|
return result
|
|
|
"""
|
|
|
|
|
|
####################彩色图像添加高斯噪声#######################################
|
|
|
"""
|
|
|
def add_noise(image,mean,var):
|
|
|
img = np.array(image / 255, dtype=float)
|
|
|
noise = np.random.normal(mean, var ** 0.5, img.shape)
|
|
|
out_img = img + noise
|
|
|
if out_img.min() < 0:
|
|
|
low_clip = -1
|
|
|
else:
|
|
|
low_clip = 0
|
|
|
out_img = np.clip(out_img, low_clip, 1.0)
|
|
|
out_img = out_img * 255
|
|
|
return out_img
|
|
|
"""
|
|
|
def add_noise(image, mean=0.0, var=0.1):
|
|
|
img = np.array(image / 255, dtype=float)
|
|
|
noise = np.random.normal(mean, var, image.shape)
|
|
|
out_img = img + noise
|
|
|
if out_img.min() < 0:
|
|
|
low_clip = -1.
|
|
|
else:
|
|
|
low_clip = 0.
|
|
|
gauss_noise = np.clip(out_img, low_clip, 1.0)
|
|
|
gauss_noise = np.uint8(out_img * 255)
|
|
|
return out_img
|
|
|
|
|
|
################图像锐化#####################
|
|
|
def lap_9(image): #拉普拉斯变化
|
|
|
lap_9 = np.array([[-1, -1, -1], [-1, 9, -1], [-1, -1, -1]])
|
|
|
# 拉普拉斯9的锐化
|
|
|
image = cv2.filter2D(image, cv2.CV_8U, lap_9)
|
|
|
return image
|
|
|
|
|
|
def gama_transfer(img,power1=1.5): #伽马变化
|
|
|
if len(img.shape) == 3:
|
|
|
img= cv2.cvtColor(img,cv2.CV_8U)
|
|
|
img = 255*np.power(img/255,power1)
|
|
|
img = np.around(img)
|
|
|
img[img>255] = 255
|
|
|
out_img = img.astype(np.uint8)
|
|
|
return out_img
|
|
|
|
|
|
|
|
|
def get_imghist(img): #直方图均衡
|
|
|
# 判断图像是否为三通道;
|
|
|
if len(img.shape) == 3:
|
|
|
img = cv2.cvtColor(img, cv2.CV_8U)
|
|
|
# 无 Mask,256个bins,取值范围为[0,255]
|
|
|
hist = cv2.calcHist([img], [0], None, [256], [0, 255])
|
|
|
return hist
|
|
|
|
|
|
|
|
|
def cal_equalhist(img):
|
|
|
if len(img.shape) == 3:
|
|
|
img = cv2.cvtColor(img, cv2.CV_8U)
|
|
|
h, w = img.shape[:2]
|
|
|
grathist = get_imghist(img)
|
|
|
|
|
|
zerosumMoment = np.zeros([256], np.uint32)
|
|
|
for p in range(256):
|
|
|
if p == 0:
|
|
|
zerosumMoment[p] = grathist[0]
|
|
|
else:
|
|
|
zerosumMoment[p] = zerosumMoment[p - 1] + grathist[p]
|
|
|
|
|
|
output_q = np.zeros([256], np.uint8)
|
|
|
cofficient = 256.0 / (h * w)
|
|
|
for p in range(256):
|
|
|
q = cofficient * float(zerosumMoment[p]) - 1
|
|
|
if q >= 0:
|
|
|
output_q[p] = math.floor(q)
|
|
|
else:
|
|
|
output_q[p] = 0
|
|
|
|
|
|
equalhistimage = np.zeros(img.shape, np.uint8)
|
|
|
for i in range(h):
|
|
|
for j in range(w):
|
|
|
equalhistimage[i][j] = output_q[img[i][j]]
|
|
|
|
|
|
return equalhistimage
|
|
|
"""
|
|
|
img = cv2.imread('img.jpg',1)
|
|
|
(b,g,r) = cv2.split(img) #通道分解
|
|
|
bH = cv2.equalizeHist(b)
|
|
|
gH = cv2.equalizeHist(g)
|
|
|
rH = cv2.equalizeHist(r)
|
|
|
result = cv2.merge((bH,gH,rH),)#通道合成
|
|
|
res = np.hstack((img,result))
|
|
|
cv2.imshow('dst',res)
|
|
|
cv2.waitKey(0)
|
|
|
"""
|
|
|
################图像去噪####################################################
|
|
|
def boxFilterfun(image): #方波滤波
|
|
|
image=cv2.boxFilter(image,-1,(2,2),normalize=0)
|
|
|
return image
|
|
|
|
|
|
|
|
|
|
|
|
def medianBlurfun(image): #中值滤波
|
|
|
image=cv2.medianBlur(image,3)
|
|
|
return image
|
|
|
|
|
|
|
|
|
|
|
|
def bilateralFilterfun(image): #双边滤波
|
|
|
image=cv2.bilateralFilter(image,25,100,100)
|
|
|
return image
|
|
|
|
|
|
|
|
|
def GaussianBlurfun(image): #高斯滤波
|
|
|
image=cv2.GaussianBlur(image,(5,5),0,0)
|
|
|
return image
|
|
|
|
|
|
|
|
|
def blurfun(image): #均值滤波
|
|
|
image==cv2.blur(image,(5,5))
|
|
|
return image
|
|
|
|
|
|
|
|
|
###############图像翻转####################################################
|
|
|
def flipfun(image,x): #图像 水平翻转:0 垂直翻转:1 沿xy轴翻转:-1
|
|
|
image = cv2.flip(image,x)
|
|
|
return image
|
|
|
|
|
|
def fangsuo(image,x):
|
|
|
image = cv2.resize(image, (0, 0), fx=x, fy=x, interpolation=cv2.INTER_NEAREST)
|
|
|
return image
|
|
|
|
|
|
|
|
|
##############按位取反###################################################
|
|
|
def bitwise_notfun(image):
|
|
|
image = cv2.bitwise_not(image)
|
|
|
return image
|
|
|
|
|
|
|
|
|
##############轮廓检测####################################################
|
|
|
def morphologyExfun(image):
|
|
|
kernel = np.ones((3, 3), dtype=np.uint8)
|
|
|
image_gradient = cv2.morphologyEx(image, cv2.MORPH_GRADIENT, kernel)
|
|
|
return image_gradient
|
|
|
|
|
|
|
|
|
#############sift检测#######################################################
|
|
|
def sift_fun(image):
|
|
|
sift = cv2.SIFT_create()
|
|
|
kps = sift.detect(image)
|
|
|
image_sift = cv2.drawKeypoints(image, kps, None, -1, cv2.DrawMatchesFlags_DEFAULT)
|
|
|
return image_sift
|
|
|
|
|
|
|
|
|
##################平均值池化#################################################
|
|
|
def average_poolingfun(img, G=4):
|
|
|
out = img.copy()
|
|
|
H, W, C = img.shape
|
|
|
Nh = int(H / G)
|
|
|
Nw = int(W / G)
|
|
|
for y in range(Nh):
|
|
|
for x in range(Nw):
|
|
|
for c in range(C):
|
|
|
out[G * y:G * (y + 1), G * x:G * (x + 1), c] = np.mean(
|
|
|
out[G * y:G * (y + 1), G * x:G * (x + 1), c]).astype(np.int)
|
|
|
return out
|
|
|
|
|
|
##################################修复####
|
|
|
def xiufu(image):
|
|
|
_, mask1 = cv2.threshold(image, 245, 255, cv2.THRESH_BINARY)
|
|
|
k = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
|
|
|
mask1 = cv2.dilate(mask1, k)
|
|
|
result1 = cv2.inpaint(image, mask1[:, :, -1], 5, cv2.INPAINT_NS)
|
|
|
return result1
|
|
|
|
|
|
if __name__ == '__main__':
|
|
|
image = cv2.imread("inpaint2.jpg")
|
|
|
cv2.imshow(' ',image)
|
|
|
newimage=xiufu(image)
|
|
|
cv2.imshow(' ',newimage)
|
|
|
cv2.waitKey(0)
|
|
|
|