Files
2024-05-23 10:50:05 +08:00

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()
'''