216 lines
6.7 KiB
Python
216 lines
6.7 KiB
Python
from globalObject import *
|
|
from math import *
|
|
import math
|
|
from matplotlib import pyplot as plt
|
|
from tkinter.messagebox import showinfo, showwarning, showerror
|
|
|
|
#图像取反
|
|
def negative(im,L=255):
|
|
[m,n]=im.shape
|
|
img=im.copy()
|
|
for i in range(m):
|
|
for j in range(n):
|
|
img[i,j]=L-im[i,j]
|
|
return img
|
|
# 全局灰度线性变换(也可对彩色图像进行线性变换)
|
|
# 全局灰度线性变换(也可对彩色图像进行线性变换)
|
|
def global_linear_transmation(im,c=0,d=255):
|
|
img=im.copy()
|
|
maxV = img.max()
|
|
minV = img.min()
|
|
if maxV==minV:
|
|
return np.uint8(img)
|
|
for i in range(img.shape[0]):
|
|
for j in range(img.shape[1]):
|
|
img[i, j] = ((d-c) / (maxV - minV)) * (img[i, j] - minV)+c#img[i,j]代表的是某像素点三通道的值
|
|
return np.uint8(img)
|
|
|
|
# 对img_result进行分段线性灰度变换
|
|
def piecewise_linear_transformation(im,lists): #lists存放着各段分段前后的灰度范围
|
|
global img_result,img_empty
|
|
try:
|
|
img=im.copy()
|
|
for list in lists:
|
|
a = int(list[0])
|
|
b = int(list[1])
|
|
c = int(list[2])
|
|
d = int(list[3])
|
|
for i in range(img.shape[0]):
|
|
for j in range(img.shape[1]):
|
|
if(img[i,j]>=a and img[i,j]<=b):
|
|
img[i, j] = ((d- c) / (b-a)) * (im[i, j] - a)+c
|
|
except:
|
|
showerror("错误提示","灰度值设置不合理,起始灰度值不能与终止值相同")
|
|
img = img_empty
|
|
return img
|
|
|
|
#位平面分割
|
|
def Bit_Plane_Slicing(im):
|
|
img=im.copy()
|
|
BP=np.zeros([8,img.shape[0],img.shape[1]])
|
|
for n in range(8):
|
|
for i in range(img.shape[0]):
|
|
for j in range(img.shape[1]):
|
|
if(img[i,j]>=2**(7-n)):
|
|
BP[n][i,j]=2**(7-n)
|
|
img[i,j]=img[i,j]-2**(7-n)
|
|
else:
|
|
BP[n][i,j]=0
|
|
return BP
|
|
|
|
#对数变换,默认不改变像素点的范围(0-255)
|
|
def logarithmic_transformations(im,c=1):
|
|
img=np.zeros([im.shape[0],im.shape[1]])
|
|
for i in range(im.shape[0]):
|
|
for j in range(im.shape[1]):
|
|
img[i,j]=c*math.log(1+im[i,j])
|
|
return img
|
|
|
|
#幂次(伽马)变换
|
|
def power_law_transformations(im,r=0.45,c=1):
|
|
img=np.zeros([im.shape[0],im.shape[1]])
|
|
for i in range(im.shape[0]):
|
|
for j in range(im.shape[1]):
|
|
img[i,j]=c*255.0*(im[i,j]/255.0)**r
|
|
return np.uint8(img)
|
|
|
|
|
|
|
|
|
|
if __name__=="__main__":
|
|
im0 = cv2.imread(r'.\img\test.jpg')
|
|
im0=cv2.cvtColor(im0,cv2.COLOR_BGR2RGB)
|
|
im1=cv2.cvtColor(im0,cv2.COLOR_RGB2GRAY)
|
|
im1=piecewise_linear_transformation(im1, [[[0, 100], [0, 80]]])
|
|
plt.subplot(121), plt.imshow(im0, cmap='gray')
|
|
plt.title('Original image'), plt.xticks([]), plt.yticks([])
|
|
plt.subplot(122), plt.imshow(im1, cmap='gray')
|
|
plt.title('Piecewise linear gray enhancementt'), plt.xticks([]), plt.yticks([])
|
|
plt.show()
|
|
|
|
'''
|
|
#傅里叶频谱的对数变换
|
|
|
|
im0=cv2.imread('2.jpg')
|
|
im0=cv2.cvtColor(im0, cv2.COLOR_BGR2GRAY)
|
|
|
|
im0=abs(np.fft.fftshift(np.fft.fft2(im0)))
|
|
im1=Logarithmic_Transformations(im0,1,exp(1))
|
|
|
|
plt.subplot(121), plt.imshow(im0, cmap='gray')
|
|
plt.title('Original spectrum'), plt.xticks([]), plt.yticks([])
|
|
plt.subplot(122), plt.imshow(im1, cmap='gray')
|
|
plt.title('log Transformed Spectrum'), plt.xticks([]), plt.yticks([])
|
|
plt.show()
|
|
|
|
#加法运算去除“叠加性”随机噪音
|
|
|
|
|
|
def SaltAndPepper(src, percentage):
|
|
#NoiseImg = src #使用此语句传递的是地址,程序会出错
|
|
NoiseImg = src.copy() #在此要使用copy函数,否则src和主程序中的img都会跟着改变
|
|
NoiseNum = int(percentage * src.shape[0] * src.shape[1])
|
|
for i in range(NoiseNum):
|
|
randX = random.randint(0, src.shape[0] - 1) #产生[0, src.shape[0] - 1]之间随机整数
|
|
randY = random.randint(0, src.shape[1] - 1)
|
|
if random.randint(0, 1) == 0:
|
|
NoiseImg[randX, randY] = 0
|
|
else:
|
|
NoiseImg[randX, randY] = 255
|
|
return NoiseImg
|
|
|
|
im0=cv2.imread('2.jpg')
|
|
im0=cv2.cvtColor(im0, cv2.COLOR_BGR2GRAY)
|
|
|
|
[m,n]=im0.shape
|
|
|
|
im=np.zeros([100,m,n])
|
|
|
|
for i in range(100):
|
|
im[i]=SaltAndPepper(im0,0.1)
|
|
|
|
im2=add(im)
|
|
|
|
plt.subplot(131), plt.imshow(im0, cmap='gray')
|
|
plt.title('Original image'), plt.xticks([]), plt.yticks([])
|
|
plt.subplot(132), plt.imshow(im[0], cmap='gray')
|
|
plt.title('0.1 Salt and pepper noise'), plt.xticks([]), plt.yticks([])
|
|
plt.subplot(133), plt.imshow(im2, cmap='gray')
|
|
plt.title('Original image'), plt.xticks([]), plt.yticks([])
|
|
plt.show()
|
|
|
|
#差影法的应用
|
|
|
|
|
|
im0=cv2.imread('2.jpg')
|
|
im0=cv2.cvtColor(im0, cv2.COLOR_BGR2GRAY)
|
|
im1=cv2.imread('2.jpg')
|
|
im1=cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)
|
|
|
|
im2=im0-im1
|
|
|
|
plt.subplot(131), plt.imshow(im0, cmap='gray')
|
|
plt.title('image before'), plt.xticks([]), plt.yticks([])
|
|
plt.subplot(132), plt.imshow(im1, cmap='gray')
|
|
plt.title('image after'), plt.xticks([]), plt.yticks([])
|
|
plt.subplot(133), plt.imshow(im2, cmap='gray')
|
|
plt.title('image difference'), plt.xticks([]), plt.yticks([])
|
|
plt.show()
|
|
|
|
#用逻辑运算提取子图像
|
|
|
|
|
|
img=cv2.imread('2.jpg')
|
|
im0=cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
im0=Thresholding(im0)
|
|
im=Bit_Plane_Slicing(im0)
|
|
im1=im[0]
|
|
im1=Negative(Thresholding(im1,1,1,1),1)
|
|
|
|
kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(10, 10))
|
|
im1 = cv2.morphologyEx(im1, cv2.MORPH_CLOSE, kernel)
|
|
im1 = cv2.morphologyEx(im1, cv2.MORPH_OPEN, kernel)
|
|
|
|
im2=img_and(im0,im1)
|
|
|
|
plt.subplot(131), plt.imshow(im0,cmap='gray')
|
|
plt.title('Original Two valued image'), plt.xticks([]), plt.yticks([])
|
|
plt.subplot(132), plt.imshow(im1,cmap='gray')
|
|
plt.title('intersection Two valued image'), plt.xticks([]), plt.yticks([])
|
|
plt.subplot(133), plt.imshow(im2,cmap='gray')
|
|
plt.title('Sub image'), plt.xticks([]), plt.yticks([])
|
|
plt.show()
|
|
|
|
#用乘法运算提取局部图像
|
|
|
|
def GetStructuringElement(path):
|
|
global img, im1, im2
|
|
img = cv2.imread(path)
|
|
b, g, r = cv2.split(img)
|
|
img = cv2.merge([r, g, b])
|
|
im0 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
im = Bit_Plane_Slicing(im0)
|
|
im1 = im[0]
|
|
im1 = Negative(Thresholding(im1, 1, 1, 1), 1)
|
|
|
|
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (10, 10))
|
|
im1 = cv2.morphologyEx(im1, cv2.MORPH_CLOSE, kernel)
|
|
im1 = cv2.morphologyEx(im1, cv2.MORPH_OPEN, kernel)
|
|
|
|
r = multiply(r, im1)
|
|
g = multiply(g, im1)
|
|
b = multiply(b, im1)
|
|
im2 = cv2.merge([r, g, b])
|
|
return im2
|
|
if __name__=="__main__":
|
|
GetStructuringElement('2.jpg')
|
|
plt.subplot(131), plt.imshow(img)
|
|
plt.title('Original image'), plt.xticks([]), plt.yticks([])
|
|
plt.subplot(132), plt.imshow(im1, cmap='gray')
|
|
plt.title('Two valued image'), plt.xticks([]), plt.yticks([])
|
|
plt.subplot(133), plt.imshow(im2)
|
|
plt.title('Local image'), plt.xticks([]), plt.yticks([])
|
|
plt.show()
|
|
|
|
'''
|