diff --git a/数字图像处理平台/.idea/.gitignore b/数字图像处理平台/.idea/.gitignore
new file mode 100644
index 0000000..5c98b42
--- /dev/null
+++ b/数字图像处理平台/.idea/.gitignore
@@ -0,0 +1,2 @@
+# Default ignored files
+/workspace.xml
\ No newline at end of file
diff --git a/数字图像处理平台/.idea/inspectionProfiles/profiles_settings.xml b/数字图像处理平台/.idea/inspectionProfiles/profiles_settings.xml
new file mode 100644
index 0000000..105ce2d
--- /dev/null
+++ b/数字图像处理平台/.idea/inspectionProfiles/profiles_settings.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/数字图像处理平台/.idea/misc.xml b/数字图像处理平台/.idea/misc.xml
new file mode 100644
index 0000000..8f63975
--- /dev/null
+++ b/数字图像处理平台/.idea/misc.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/数字图像处理平台/.idea/modules.xml b/数字图像处理平台/.idea/modules.xml
new file mode 100644
index 0000000..bb9288b
--- /dev/null
+++ b/数字图像处理平台/.idea/modules.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/数字图像处理平台/.idea/resource.iml b/数字图像处理平台/.idea/resource.iml
new file mode 100644
index 0000000..0703eca
--- /dev/null
+++ b/数字图像处理平台/.idea/resource.iml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/数字图像处理平台/README.md b/数字图像处理平台/README.md
new file mode 100644
index 0000000..162a15e
--- /dev/null
+++ b/数字图像处理平台/README.md
@@ -0,0 +1,13 @@
+
+### 运行环境
+
+- python-opencv4.2
+- pyqt5
+- matplotlib3.2.1
+- numpy1.18.4
+- dlib
+
+
+### 使用说明
+
+> 配置好相关环境,直接运行main.py就ok
\ No newline at end of file
diff --git a/数字图像处理平台/__pycache__/config.cpython-37.pyc b/数字图像处理平台/__pycache__/config.cpython-37.pyc
new file mode 100644
index 0000000..0ae304c
Binary files /dev/null and b/数字图像处理平台/__pycache__/config.cpython-37.pyc differ
diff --git a/数字图像处理平台/__pycache__/config.cpython-38.pyc b/数字图像处理平台/__pycache__/config.cpython-38.pyc
new file mode 100644
index 0000000..a83a18d
Binary files /dev/null and b/数字图像处理平台/__pycache__/config.cpython-38.pyc differ
diff --git a/数字图像处理平台/__pycache__/flags.cpython-37.pyc b/数字图像处理平台/__pycache__/flags.cpython-37.pyc
new file mode 100644
index 0000000..269a2cc
Binary files /dev/null and b/数字图像处理平台/__pycache__/flags.cpython-37.pyc differ
diff --git a/数字图像处理平台/__pycache__/flags.cpython-38.pyc b/数字图像处理平台/__pycache__/flags.cpython-38.pyc
new file mode 100644
index 0000000..3884da1
Binary files /dev/null and b/数字图像处理平台/__pycache__/flags.cpython-38.pyc differ
diff --git a/数字图像处理平台/__pycache__/main.cpython-37.pyc b/数字图像处理平台/__pycache__/main.cpython-37.pyc
new file mode 100644
index 0000000..32a1f6f
Binary files /dev/null and b/数字图像处理平台/__pycache__/main.cpython-37.pyc differ
diff --git a/数字图像处理平台/__pycache__/run.cpython-37.pyc b/数字图像处理平台/__pycache__/run.cpython-37.pyc
new file mode 100644
index 0000000..8ac1fa1
Binary files /dev/null and b/数字图像处理平台/__pycache__/run.cpython-37.pyc differ
diff --git a/数字图像处理平台/config.py b/数字图像处理平台/config.py
new file mode 100644
index 0000000..e00397a
--- /dev/null
+++ b/数字图像处理平台/config.py
@@ -0,0 +1,35 @@
+from custom.tableWidget import *
+from custom.listWidgetItems import *
+
+
+# Implemented functions
+items = [
+ GeometricTransItem,
+ GrayingItem,
+ EqualizeItem,
+ FilterItem,
+ SharpenItem,
+ AddNoiseItem,
+ FrequencyFilterItem,
+ SelectFilterItem,
+ ColorImageProcessItem,
+ AffineItem,
+ BeautyItem,
+ IdCardPicGenerateItem,
+]
+
+tables = [
+ GeometricTransTableWight,
+ GrayingTableWidget,
+ EqualizeTableWidget,
+ FilterTabledWidget,
+ SharpenItemTableWidget,
+ AddNoiseItemTableWidget,
+ FrequencyFilterTabledWidget,
+ SelectFilterTabledWidget,
+ ColorImageProcessTabledWidget,
+ LineTableWidget,
+ BeautyTableWight,
+ IdCardPicGenerateTabledWidget,
+]
+
diff --git a/数字图像处理平台/custom/ImageView.py b/数字图像处理平台/custom/ImageView.py
new file mode 100644
index 0000000..4de57d5
--- /dev/null
+++ b/数字图像处理平台/custom/ImageView.py
@@ -0,0 +1,15 @@
+from cv2 import selectROI,imwrite
+from PyQt5.QtWidgets import QMainWindow, QFileDialog
+
+
+class childwindow1(QMainWindow):
+ def __init__(self,parent=None):
+ super(childwindow1, self).__init__(parent)
+ def openfile(self):
+ fname, _ = QFileDialog.getOpenFileName(self, 'Open file', '.', 'Image Files(*.jpg *.bmp *.png *.jpeg *.rgb *.tif)')
+ return fname
+ def selectROI(self,img):
+ bbox = selectROI(img, False)
+ cut = img[bbox[1]:bbox[1] + bbox[3], bbox[0]:bbox[0] + bbox[2]]
+ imwrite('cut.jpg', cut)
+
diff --git a/数字图像处理平台/custom/__pycache__/ImageView.cpython-37.pyc b/数字图像处理平台/custom/__pycache__/ImageView.cpython-37.pyc
new file mode 100644
index 0000000..78f3091
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/ImageView.cpython-37.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/ImageView.cpython-38.pyc b/数字图像处理平台/custom/__pycache__/ImageView.cpython-38.pyc
new file mode 100644
index 0000000..9f99b0c
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/ImageView.cpython-38.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/graphicsView.cpython-37.pyc b/数字图像处理平台/custom/__pycache__/graphicsView.cpython-37.pyc
new file mode 100644
index 0000000..202dd97
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/graphicsView.cpython-37.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/graphicsView.cpython-38.pyc b/数字图像处理平台/custom/__pycache__/graphicsView.cpython-38.pyc
new file mode 100644
index 0000000..ce63b71
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/graphicsView.cpython-38.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/listWidgetItems.cpython-37.pyc b/数字图像处理平台/custom/__pycache__/listWidgetItems.cpython-37.pyc
new file mode 100644
index 0000000..ed623ea
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/listWidgetItems.cpython-37.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/listWidgetItems.cpython-38.pyc b/数字图像处理平台/custom/__pycache__/listWidgetItems.cpython-38.pyc
new file mode 100644
index 0000000..0136179
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/listWidgetItems.cpython-38.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/listWidgets.cpython-37.pyc b/数字图像处理平台/custom/__pycache__/listWidgets.cpython-37.pyc
new file mode 100644
index 0000000..aef3aca
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/listWidgets.cpython-37.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/listWidgets.cpython-38.pyc b/数字图像处理平台/custom/__pycache__/listWidgets.cpython-38.pyc
new file mode 100644
index 0000000..289384e
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/listWidgets.cpython-38.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/stackedWidget.cpython-37.pyc b/数字图像处理平台/custom/__pycache__/stackedWidget.cpython-37.pyc
new file mode 100644
index 0000000..224816a
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/stackedWidget.cpython-37.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/stackedWidget.cpython-38.pyc b/数字图像处理平台/custom/__pycache__/stackedWidget.cpython-38.pyc
new file mode 100644
index 0000000..73cccbe
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/stackedWidget.cpython-38.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/tableWidget.cpython-37.pyc b/数字图像处理平台/custom/__pycache__/tableWidget.cpython-37.pyc
new file mode 100644
index 0000000..b402e34
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/tableWidget.cpython-37.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/tableWidget.cpython-38.pyc b/数字图像处理平台/custom/__pycache__/tableWidget.cpython-38.pyc
new file mode 100644
index 0000000..f6c13d5
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/tableWidget.cpython-38.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/treeView.cpython-37.pyc b/数字图像处理平台/custom/__pycache__/treeView.cpython-37.pyc
new file mode 100644
index 0000000..5298d90
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/treeView.cpython-37.pyc differ
diff --git a/数字图像处理平台/custom/__pycache__/treeView.cpython-38.pyc b/数字图像处理平台/custom/__pycache__/treeView.cpython-38.pyc
new file mode 100644
index 0000000..cab85fb
Binary files /dev/null and b/数字图像处理平台/custom/__pycache__/treeView.cpython-38.pyc differ
diff --git a/数字图像处理平台/custom/graphicsView.py b/数字图像处理平台/custom/graphicsView.py
new file mode 100644
index 0000000..d268cca
--- /dev/null
+++ b/数字图像处理平台/custom/graphicsView.py
@@ -0,0 +1,78 @@
+from PyQt5.QtCore import Qt, QRectF
+from PyQt5.QtGui import QCursor, QImage, QPixmap
+from PyQt5.QtWidgets import QGraphicsView, QGraphicsPixmapItem, QGraphicsScene, QMenu, QAction, QFileDialog
+from cv2 import cvtColor,COLOR_BGR2RGB
+
+class GraphicsView(QGraphicsView):
+ def __init__(self, parent=None):
+ super(GraphicsView, self).__init__(parent=parent)
+ self._zoom = 0
+ self._empty = True
+ self._photo = QGraphicsPixmapItem()
+ self._scene = QGraphicsScene(self)
+ self._scene.addItem(self._photo)
+
+
+ self.setScene(self._scene)
+ # self.setScene(self._scene1)
+ self.setAlignment(Qt.AlignCenter) # 居中显示
+ self.setDragMode(QGraphicsView.ScrollHandDrag) # 设置拖动
+ self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
+ self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)
+ self.setMinimumSize(640, 480)
+
+ def contextMenuEvent(self, event):
+ if not self.has_photo():
+ return
+ menu = QMenu()
+ save_action = QAction('另存为', self)
+ save_action.triggered.connect(self.save_current) # 传递额外值
+ menu.addAction(save_action)
+ menu.exec(QCursor.pos())
+
+ def save_current(self):
+ file_name = QFileDialog.getSaveFileName(self, '另存为', './', 'Image files(*.jpg *.gif *.png)')[0]
+ print(file_name)
+ if file_name:
+ self._photo.pixmap().save(file_name)
+
+ def get_image(self):
+ if self.has_photo():
+ return self._photo.pixmap().toImage()
+
+ def has_photo(self):
+ return not self._empty
+
+ def change_image(self, img):
+ self.update_image(img)
+ self.fitInView()
+
+ def img_to_pixmap(self, img):
+ img = cvtColor(img, COLOR_BGR2RGB) # bgr -> rgb
+ h, w, c = img.shape # 获取图片形状
+ image = QImage(img, w, h, 3 * w, QImage.Format_RGB888)
+ return QPixmap.fromImage(image)
+
+ def update_image(self, img):
+ self._empty = False
+ self._photo.setPixmap(self.img_to_pixmap(img))
+
+ def fitInView(self, scale=True):
+ rect = QRectF(self._photo.pixmap().rect())
+ if not rect.isNull():
+ self.setSceneRect(rect)
+
+ def wheelEvent(self, event):
+ if self.has_photo():
+ if event.angleDelta().y() > 0:
+ factor = 1.25
+ self._zoom += 1
+ else:
+ factor = 0.8
+ self._zoom -= 1
+ if self._zoom > 0:
+ self.scale(factor, factor)
+ elif self._zoom == 0:
+ self.fitInView()
+ else:
+ self._zoom = 0
diff --git a/数字图像处理平台/custom/listWidgetItems.py b/数字图像处理平台/custom/listWidgetItems.py
new file mode 100644
index 0000000..de949ea
--- /dev/null
+++ b/数字图像处理平台/custom/listWidgetItems.py
@@ -0,0 +1,276 @@
+from PyQt5.QtWidgets import QListWidgetItem
+from flags import *
+
+# 功能区引用
+# 几何变换
+from function.GeometricTrans.Ratate import ratate
+from function.GeometricTrans.Mirror import mirror1,mirror2,mirror3
+from function.GeometricTrans.LargeSmall import largeSmall
+# 灰度变换
+from function.GrayscaleTrans.Reverse import image_reverse
+from function.GrayscaleTrans.GammaTrans import gammaTranform
+from function.GrayscaleTrans.Binarization import binarization
+from function.GrayscaleTrans.BGR2GRAY import rgbToGray
+# 直方图处理
+from function.HistogramTrans.Equalize import hist_equal
+from function.HistogramTrans.HistogramMatch import HisgramMatch
+# 平滑处理
+from function.SmoothingTrans.GaussianFilter import gaussian_filter
+from function.SmoothingTrans.MeanFilter import mean_filter
+from function.SmoothingTrans.MedianFilter import median_filter
+# 锐化处理
+from function.SharpenTrans.SobelFilter import sobel_filter
+from function.SharpenTrans.Robert import robert
+from function.SharpenTrans.Laplacian import laplacian_filter
+from function.SharpenTrans.Prewitt import prewitt_filter
+from function.SharpenTrans.Canny import CannyFilter
+from function.SharpenTrans.LoG import LogFilter
+# 加性噪声
+from function.AddNoise.GasussNoise import gasuss_noise
+from function.AddNoise.ImpluseNoise import impluse_noise
+from function.AddNoise.RayleighNoise import rayleigh_noise
+from function.AddNoise.GammaNoise import gamma_noise
+from function.AddNoise.UniformNoise import uniform_noise
+from function.AddNoise.ExponentialNoise import exponential_noise
+# 频域滤波 | 选择滤波
+from function.FrequencyDomainFilter.ButterWorthFilter import butterworthSelectFilter, butterworthFilter
+from function.FrequencyDomainFilter.IdealFilter import idealFilter,idealSelectFilter,idealNotchFilter
+from function.FrequencyDomainFilter.GaussianFrequencyFilter import GaussianFilter,GaussianSelectFilter
+# 彩色图像处理
+from function.ColorImageProcess.HSIProcess import hsvProcess, rgb2hsi
+from function.ColorImageProcess.RGB2CMY import rgb2cmy
+from function.ColorImageProcess.PseudoColorTrans import pseudoColorTrans
+#线条变换和图片修复
+from function.LineChange.AffineTransformation import Affine
+from function.LineChange.LineCheck import LineCheck
+from function.LineChange.ImgeFix import ImgeFix
+# 证件照生成
+from function.IdCardPicGenerate.IdCardPicGenerate import idCardPicGenerate
+# 美颜功能
+from function.Beauty.Beauty import Beauty
+
+class MyItem(QListWidgetItem):
+ def __init__(self, name=None, parent=None):
+ super(MyItem, self).__init__(name, parent=parent)
+
+ def get_params(self):
+ protected = [v for v in dir(self) if v.startswith('_') and not v.startswith('__')]
+ param = {}
+ for v in protected:
+ param[v.replace('_', '', 1)] = self.__getattribute__(v)
+ return param
+
+ def update_params(self, param):
+ for k, v in param.items():
+ if '_' + k in dir(self):
+ self.__setattr__('_' + k, v)
+
+
+class GeometricTransItem(MyItem):
+ def __init__(self, parent=None):
+ super(GeometricTransItem, self).__init__(' 几何变换 ', parent=parent)
+ self._kind = 0
+ self._rate = 100
+
+ def __call__(self, img):
+ if self._kind == 0:
+ img = largeSmall(img,self._rate)
+ elif self._kind == 1:
+ img = mirror1(img,self._rate)
+ elif self._kind == 2:
+ img = mirror2(img,self._rate)
+ elif self._kind == 3:
+ img = mirror3(img,self._rate)
+ elif self._kind == 4:
+ img = ratate(img,self._rate)
+ return img
+
+class GrayingItem(MyItem):
+ def __init__(self, parent=None):
+ super(GrayingItem, self).__init__(' 灰度变换 ', parent=parent)
+ self._kind = RBG2GRAY
+ self._c_value = 1
+ self._γ_value = 3.0
+
+ def __call__(self, img):
+ if self._kind == 0:
+ img = rgbToGray(img)
+ elif self._kind == 1:
+ img = image_reverse(img)
+ elif self._kind == 2:
+ img = binarization(img)
+ elif self._kind == 3:
+ img = gammaTranform(self._c_value,self._γ_value,img)
+ return img
+
+
+class EqualizeItem(MyItem):
+ def __init__(self, parent=None):
+ super().__init__(' 直方图处理 ', parent=parent)
+ self._kind = 0
+
+ def __call__(self, img):
+ if self._kind == 0:
+ img = hist_equal(img)
+ elif self._kind == 1:
+ img = HisgramMatch(img)
+ return img
+
+class AffineItem(MyItem):
+ def __init__(self, parent=None):
+ super().__init__(' 变换 ', parent=parent)
+ self._kind = 0
+
+ def __call__(self, img):
+ if self._kind == 0:
+ img = Affine(img)
+ elif self._kind == 1:
+ img = LineCheck(img)
+ elif self._kind == 2:
+ img = ImgeFix(img)
+ return img
+
+class BeautyItem(MyItem):
+ def __init__(self, parent=None):
+ super().__init__('美颜功能', parent=parent)
+ self._kind = 0
+
+ def __call__(self, img):
+ img = Beauty(img)
+ return img
+
+class FilterItem(MyItem):
+
+ def __init__(self, parent=None):
+ super().__init__('平滑处理', parent=parent)
+ self._ksize = 3
+ self._kind = 0
+ self._sigma = 1
+
+ def __call__(self, img):
+ if self._kind == 0:
+ img = cv2.blur(img, (self._ksize, self._ksize))
+ # img = mean_filter(img,self._ksize)
+ elif self._kind == 1:
+ # cv2实现的中值滤波
+ img = cv2.medianBlur(img, self._ksize)
+ # python实现的中值滤波
+ # img = median_filter(img, self._ksize)
+ elif self._kind == 2:
+ # img = cv2.GaussianBlur(img, (self._ksize, self._ksize), self._sigma)
+ img = gaussian_filter(img,self._ksize,self._sigma)
+
+ return img
+
+
+class SharpenItem(MyItem):
+ def __init__(self, parent=None):
+ super().__init__('锐化处理', parent=parent)
+ self._kind = 0
+
+ def __call__(self, img):
+ if self._kind == 0:
+ # python实现
+ img = sobel_filter(img)
+ # cv2实现
+ # img = cv2_sobel(img)
+ elif self._kind == 1:
+ img = robert(img)
+ # cv2实现
+ # img = cv2_robert(img)
+ elif self._kind == 2:
+ img = prewitt_filter(img)
+ elif self._kind == 3:
+ img = laplacian_filter(img)
+ elif self._kind == 4:
+ img = CannyFilter(img)
+ elif self._kind == 5:
+ img = LogFilter(img)
+ return img
+
+class AddNoiseItem(MyItem):
+ def __init__(self, parent=None):
+ super().__init__('加性噪声', parent=parent)
+ self._kind = 0
+ self._scale = 0.1
+
+ def __call__(self, img):
+ if self._kind == 0:
+ img = gasuss_noise(img,self._scale)
+ elif self._kind == 1:
+ img = rayleigh_noise(img,self._scale)
+ elif self._kind == 2:
+ img = gamma_noise(img,self._scale)
+ elif self._kind == 3:
+ img = uniform_noise(img,self._scale)
+ elif self._kind == 4:
+ img = impluse_noise(img,self._scale)
+ elif self._kind == 5:
+ img = exponential_noise(img,self._scale)
+ return img
+
+class FrequencyFilterItem(MyItem):
+ def __init__(self, parent=None):
+ super().__init__('频域滤波', parent=parent)
+ self._kind = 0
+ self._scale = 30
+ self._n = 1
+ def __call__(self, img):
+ if self._kind == 0 or self._kind == 3:
+ img = idealFilter(img,self._scale,self._kind)
+ elif self._kind == 1 or self._kind == 4:
+ img = butterworthFilter(img,self._scale,self._n,self._kind)
+ elif self._kind == 2 or self._kind == 5:
+ img = GaussianFilter(img,self._scale,self._kind)
+ return img
+
+
+class SelectFilterItem(MyItem):
+ def __init__(self, parent=None):
+ super().__init__('选择滤波', parent=parent)
+ self._kind = 0
+ self._scale = 30
+ self._n = 1
+ self._W = 10
+ def __call__(self, img):
+ if self._kind == 0 or self._kind == 3:
+ img = idealSelectFilter(img,self._scale,self._W,self._kind)
+ elif self._kind == 1 or self._kind == 4:
+ img = butterworthSelectFilter(img,self._scale,self._n,self._W,self._kind)
+ elif self._kind == 2 or self._kind == 5:
+ img = GaussianSelectFilter(img,self._scale,self._W,self._kind)
+ elif self._kind == 6 or self._kind == 7:
+ img = idealNotchFilter(img,self._scale,self._kind)
+ return img
+
+class ColorImageProcessItem(MyItem):
+ def __init__(self, parent=None):
+ super().__init__('彩色图像处理', parent=parent)
+ self._kind = 0
+ self._H = 100
+ self._S = 100
+ self._V = 100
+ self._color_kind = 0
+
+ def __call__(self, img):
+ if self._kind == 0:
+ img = hsvProcess(img,self._H,self._S,self._V)
+ elif self._kind == 1:
+ img = rgb2cmy(img,self._H,self._S,self._V)
+ elif self._kind == 2:
+ img = rgb2hsi(img,self._H,self._S,self._V)
+ elif self._kind == 3:
+ img = pseudoColorTrans(img,self._H,self._S,self._V,self._color_kind)
+ return img
+
+
+class IdCardPicGenerateItem(MyItem):
+ def __init__(self, parent=None):
+ super().__init__('人像背景切换', parent=parent)
+ self._kind = 0
+ self._H = 100
+ self._S = 100
+ self._V = 100
+ def __call__(self, img):
+ img = idCardPicGenerate(img, self._kind)
+ return img
\ No newline at end of file
diff --git a/数字图像处理平台/custom/listWidgets.py b/数字图像处理平台/custom/listWidgets.py
new file mode 100644
index 0000000..7fa8392
--- /dev/null
+++ b/数字图像处理平台/custom/listWidgets.py
@@ -0,0 +1,86 @@
+from PyQt5.QtCore import Qt
+from PyQt5.QtGui import QCursor
+from PyQt5.QtWidgets import QListWidget, QListView, QAbstractItemView, QAction, QMenu
+
+from config import items
+
+
+class MyListWidget(QListWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent=parent)
+ self.mainwindow = parent
+ self.setDragEnabled(True)
+ # 选中不显示虚线
+ # self.setEditTriggers(QAbstractItemView.NoEditTriggers)
+ self.setFocusPolicy(Qt.NoFocus)
+
+
+class UsedListWidget(MyListWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent=parent)
+ self.setAcceptDrops(True) # 激活组件的拖拽事件
+ self.setFlow(QListView.TopToBottom) # 设置列表方向(表示数据项从上至下排列)
+ self.setDefaultDropAction(Qt.MoveAction) # 设置拖放为移动而不是复制一个
+ self.setDragDropMode(QAbstractItemView.InternalMove) # 设置拖放模式, 内部拖放
+ self.itemClicked.connect(self.show_attr)
+ self.setMinimumWidth(200)
+
+ self.move_item = None
+
+ def contextMenuEvent(self, e):
+ # 右键菜单事件
+ item = self.itemAt(self.mapFromGlobal(QCursor.pos()))
+ if not item: return # 判断是否是空白区域
+ menu = QMenu()
+ delete_action = QAction('删除', self)
+ delete_action.triggered.connect(lambda: self.delete_item(item)) # 传递额外值
+ menu.addAction(delete_action)
+ menu.exec(QCursor.pos())
+
+ def delete_item(self, item):
+ # 删除操作
+ self.takeItem(self.row(item))
+ self.mainwindow.update_image() # 更新frame
+ self.mainwindow.dock_attr.close()
+
+ def dropEvent(self, event):
+ super().dropEvent(event)
+ self.mainwindow.update_image()
+
+ def show_attr(self):
+ item = self.itemAt(self.mapFromGlobal(QCursor.pos()))
+ if not item: return
+ param = item.get_params() # 获取当前item的属性
+ if type(item) in items:
+ index = items.index(type(item)) # 获取item对应的table索引
+ self.mainwindow.stackedWidget.setCurrentIndex(index)
+ self.mainwindow.stackedWidget.currentWidget().update_params(param) # 更新对应的table
+ self.mainwindow.dock_attr.show()
+
+
+class FuncListWidget(MyListWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent=parent)
+ self.setFixedHeight(64)
+ self.setFlow(QListView.LeftToRight) # 设置列表方向
+ self.setViewMode(QListView.IconMode) # 设置列表模式
+ # self.setViewMode(QListView.ViewMode)
+ self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) # 关掉滑动条
+ self.setAcceptDrops(False)
+ for itemType in items:
+ self.addItem(itemType())
+ self.itemClicked.connect(self.add_used_function)
+
+ def add_used_function(self):
+ func_item = self.currentItem()
+ if type(func_item) in items:
+ use_item = type(func_item)()
+ self.mainwindow.useListWidget.addItem(use_item)
+ self.mainwindow.update_image()
+
+ def enterEvent(self, event):
+ self.setCursor(Qt.PointingHandCursor)
+
+ def leaveEvent(self, event):
+ self.setCursor(Qt.ArrowCursor)
+ self.setCurrentRow(-1) # 取消选中状态
diff --git a/数字图像处理平台/custom/stackedWidget.py b/数字图像处理平台/custom/stackedWidget.py
new file mode 100644
index 0000000..37e2ca3
--- /dev/null
+++ b/数字图像处理平台/custom/stackedWidget.py
@@ -0,0 +1,11 @@
+from PyQt5.QtWidgets import QStackedWidget
+
+from config import tables
+
+
+class StackedWidget(QStackedWidget):
+ def __init__(self, parent):
+ super().__init__(parent=parent)
+ for table in tables:
+ self.addWidget(table(parent=parent))
+ self.setMinimumWidth(200)
diff --git a/数字图像处理平台/custom/tableWidget.py b/数字图像处理平台/custom/tableWidget.py
new file mode 100644
index 0000000..1efcaac
--- /dev/null
+++ b/数字图像处理平台/custom/tableWidget.py
@@ -0,0 +1,385 @@
+from PyQt5.QtCore import Qt
+from PyQt5.QtWidgets import QTableWidget, QAbstractItemView, QHeaderView, QSpinBox, QDoubleSpinBox, QCheckBox, \
+ QComboBox, QWidget, QTableWidgetItem, QSlider, QLabel
+
+
+class TableWidget(QTableWidget):
+ def __init__(self, parent=None):
+ super(TableWidget, self).__init__(parent=parent)
+ self.mainwindow = parent
+ self.setShowGrid(True) # 显示网格
+ self.setAlternatingRowColors(True) # 隔行显示颜色
+ self.setEditTriggers(QAbstractItemView.NoEditTriggers)
+ self.horizontalHeader().setVisible(False)
+ self.verticalHeader().setVisible(False)
+ self.horizontalHeader().sectionResizeMode(QHeaderView.Stretch)
+ self.verticalHeader().sectionResizeMode(QHeaderView.Stretch)
+ self.horizontalHeader().setStretchLastSection(True)
+ self.setFocusPolicy(Qt.NoFocus)
+
+ def signal_connect(self):
+ for spinbox in self.findChildren(QSpinBox):
+ spinbox.valueChanged.connect(self.update_item)
+ for doublespinbox in self.findChildren(QDoubleSpinBox):
+ doublespinbox.valueChanged.connect(self.update_item)
+ for combox in self.findChildren(QComboBox):
+ combox.currentIndexChanged.connect(self.update_item)
+ for checkbox in self.findChildren(QCheckBox):
+ checkbox.stateChanged.connect(self.update_item)
+ for qslider in self.findChildren(QSlider):
+ qslider.valueChanged.connect(self.update_item)
+
+ def update_item(self):
+ param = self.get_params()
+ self.mainwindow.useListWidget.currentItem().update_params(param)
+ self.mainwindow.update_image()
+
+ def update_params(self, param=None):
+ for key in param.keys():
+ box = self.findChild(QWidget, name=key)
+ if isinstance(box, QSpinBox) or isinstance(box, QDoubleSpinBox):
+ box.setValue(param[key])
+ elif isinstance(box, QComboBox):
+ box.setCurrentIndex(param[key])
+ elif isinstance(box, QCheckBox):
+ box.setChecked(param[key])
+ elif isinstance(box, QSlider):
+ box.setValue(param[key])
+
+ def get_params(self):
+ param = {}
+ for spinbox in self.findChildren(QSpinBox):
+ param[spinbox.objectName()] = spinbox.value()
+ for doublespinbox in self.findChildren(QDoubleSpinBox):
+ param[doublespinbox.objectName()] = doublespinbox.value()
+ for combox in self.findChildren(QComboBox):
+ param[combox.objectName()] = combox.currentIndex()
+ for combox in self.findChildren(QCheckBox):
+ param[combox.objectName()] = combox.isChecked()
+ for qslider in self.findChildren(QSlider):
+ param[qslider.objectName()] = qslider.value()
+ return param
+
+
+class GeometricTransTableWight(TableWidget):
+ def __init__(self, parent=None):
+ super(GeometricTransTableWight, self).__init__(parent=parent)
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['放大|缩小','图像水平镜像','图像垂直镜像','图像对角镜像','图像旋转'])
+ self.kind_comBox.setObjectName('kind')
+
+ self.setColumnCount(2)
+ self.setRowCount(2)
+
+
+ self.rate_value_spinBox = QSpinBox()
+ self.rate_value_spinBox.setObjectName('rate')
+ self.rate_value_spinBox.setRange(0,360)
+ self.rate_value_spinBox.setSingleStep(10)
+ # self.rate_value_spinBox.setSuffix("%")
+ self.setItem(0, 0, QTableWidgetItem('类型'))
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.setItem(1, 0, QTableWidgetItem('比例%|角度°'))
+ self.setCellWidget(1, 1, self.rate_value_spinBox)
+ self.signal_connect()
+
+class BeautyTableWight(TableWidget):
+ def __init__(self, parent=None):
+ super(BeautyTableWight, self).__init__(parent=parent)
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['美颜功能'])
+ self.kind_comBox.setObjectName('kind')
+ self.setColumnCount(1)
+ self.setRowCount(1)
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.signal_connect()
+
+
+class GrayingTableWidget(TableWidget):
+ def __init__(self, parent=None):
+ super(GrayingTableWidget, self).__init__(parent=parent)
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['灰度化', '图像反转', '二值化','幂律变换'])
+ self.kind_comBox.setObjectName('kind')
+
+ self.c_value_spinBox = QSpinBox()
+ self.c_value_spinBox.setObjectName('c_value')
+ self.c_value_spinBox.setMinimum(1)
+ self.c_value_spinBox.setSingleStep(1)
+
+ self.γ_value_spinBox = QSpinBox()
+ self.γ_value_spinBox.setObjectName('γ_value')
+ self.γ_value_spinBox.setMinimum(1)
+ self.γ_value_spinBox.setSingleStep(1)
+
+ self.setColumnCount(2)
+ self.setRowCount(3)
+ self.setItem(0, 0, QTableWidgetItem('类型'))
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.setItem(1, 0, QTableWidgetItem('c值(幂律变换)'))
+ self.setCellWidget(1, 1, self.c_value_spinBox)
+ self.setItem(2, 0, QTableWidgetItem('γ值(幂律变换)'))
+ self.setCellWidget(2, 1, self.γ_value_spinBox)
+
+ self.signal_connect()
+
+class EqualizeTableWidget(TableWidget):
+ def __init__(self, parent=None):
+ super(EqualizeTableWidget, self).__init__(parent=parent)
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['直方图均衡化', '直方图匹配'])
+ self.kind_comBox.setObjectName('kind')
+ self.setColumnCount(2)
+ self.setRowCount(1)
+ self.setItem(0, 0, QTableWidgetItem('类型'))
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.signal_connect()
+
+class LineTableWidget(TableWidget):
+ def __init__(self, parent=None):
+ super(LineTableWidget, self).__init__(parent=parent)
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['仿射变换', '线条变化检测','图像修复'])
+ self.kind_comBox.setObjectName('kind')
+ self.setColumnCount(2)
+ self.setRowCount(1)
+ self.setItem(0, 0, QTableWidgetItem('类型'))
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.signal_connect()
+
+class EqualizeTableWidget(TableWidget):
+ def __init__(self, parent=None):
+ super(EqualizeTableWidget, self).__init__(parent=parent)
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['直方图均衡化', '直方图匹配'])
+ self.kind_comBox.setObjectName('kind')
+ self.setColumnCount(2)
+ self.setRowCount(1)
+ self.setItem(0, 0, QTableWidgetItem('类型'))
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.signal_connect()
+
+class FilterTabledWidget(TableWidget):
+ def __init__(self, parent=None):
+ super(FilterTabledWidget, self).__init__(parent=parent)
+
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['均值滤波', '中值滤波','高斯滤波'])
+ self.kind_comBox.setObjectName('kind')
+
+
+ self.ksize_spinBox = QSpinBox()
+ self.ksize_spinBox.setObjectName('ksize')
+ self.ksize_spinBox.setMinimum(1)
+ self.ksize_spinBox.setSingleStep(2)
+
+ self.sigma_DoubleBox = QDoubleSpinBox()
+ self.sigma_DoubleBox.setObjectName('sigma')
+ self.sigma_DoubleBox.setMinimum(1)
+ self.sigma_DoubleBox.setSingleStep(1)
+
+ self.setColumnCount(2)
+ self.setRowCount(3)
+ self.setItem(0, 0, QTableWidgetItem('类型'))
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.setItem(1, 0, QTableWidgetItem('size'))
+ self.setCellWidget(1, 1, self.ksize_spinBox)
+ self.setItem(2, 0, QTableWidgetItem('sigma(高斯滤波)'))
+ self.setCellWidget(2, 1, self.sigma_DoubleBox)
+
+ self.signal_connect()
+
+
+class SharpenItemTableWidget(TableWidget):
+ def __init__(self, parent=None):
+ super(SharpenItemTableWidget, self).__init__(parent=parent)
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['sobel算子','robert算子','prewitt算子','laplacian算子','Canny算子','LoG边缘检测算子'])
+ self.kind_comBox.setObjectName('kind')
+
+ self.setColumnCount(2)
+ self.setRowCount(1)
+ self.setItem(0, 0, QTableWidgetItem('类型'))
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.signal_connect()
+
+class AddNoiseItemTableWidget(TableWidget):
+ def __init__(self, parent=None):
+ super(AddNoiseItemTableWidget, self).__init__(parent=parent)
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['高斯噪声','瑞利噪声','伽马噪声','均匀噪声','椒盐噪声','指数噪声'])
+ self.kind_comBox.setObjectName('kind')
+
+ self.ksize_DoubleBox = QDoubleSpinBox()
+ self.ksize_DoubleBox.setMinimum(0)
+ self.ksize_DoubleBox.setSingleStep(0.1)
+ self.ksize_DoubleBox.setObjectName('scale')
+
+ self.setColumnCount(2)
+ self.setRowCount(2)
+ self.setItem(0, 0, QTableWidgetItem('噪声类型'))
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.setItem(1, 0, QTableWidgetItem('噪声比例'))
+ self.setCellWidget(1, 1, self.ksize_DoubleBox)
+ self.signal_connect()
+
+
+class FrequencyFilterTabledWidget(TableWidget):
+ def __init__(self, parent=None):
+ super(FrequencyFilterTabledWidget, self).__init__(parent=parent)
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['理想低通滤波','巴特沃思低通滤波','高斯低通滤波','理想高通滤波','巴特沃思高通滤波','高斯高通滤波'])
+ self.kind_comBox.setObjectName('kind')
+ self.ksize_SpinBox = QSpinBox()
+ self.ksize_SpinBox.setMinimum(10)
+ self.ksize_SpinBox.setSingleStep(10)
+ self.ksize_SpinBox.setObjectName('scale')
+ self.n_Spinbox = QSpinBox()
+ self.n_Spinbox.setMinimum(1)
+ self.n_Spinbox.setSingleStep(1)
+ self.n_Spinbox.setObjectName('n')
+
+ self.setColumnCount(2)
+ self.setRowCount(3)
+ self.setItem(0, 0, QTableWidgetItem('滤波类型'))
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.setItem(1, 0, QTableWidgetItem('半径r'))
+ self.setCellWidget(1, 1, self.ksize_SpinBox)
+ self.setItem(2,0,QTableWidgetItem('阶数n'))
+ self.setCellWidget(2,1,self.n_Spinbox)
+ self.signal_connect()
+
+
+class SelectFilterTabledWidget(TableWidget):
+ def __init__(self, parent=None):
+ super(SelectFilterTabledWidget, self).__init__(parent=parent)
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['理想带阻滤波', '巴特沃思带阻滤波', '高斯带阻滤波', '理想带通滤波', '巴特沃思带通滤波', '高斯带通滤波','理想带阻陷波','理想带通陷波'])
+ self.kind_comBox.setObjectName('kind')
+ self.ksize_SpinBox = QSpinBox()
+ self.ksize_SpinBox.setMinimum(0)
+ self.ksize_SpinBox.setMaximum(300)
+ self.ksize_SpinBox.setSingleStep(10)
+ self.ksize_SpinBox.setObjectName('scale')
+ self.W_Spinbox = QSpinBox()
+ self.W_Spinbox.setMinimum(0)
+ self.W_Spinbox.setMaximum(500)
+ self.W_Spinbox.setSingleStep(10)
+ self.W_Spinbox.setObjectName('W')
+ self.n_Spinbox = QSpinBox()
+ self.n_Spinbox.setMinimum(1)
+ self.n_Spinbox.setSingleStep(1)
+ self.n_Spinbox.setObjectName('n')
+
+ self.setColumnCount(2)
+ self.setRowCount(4)
+ self.setItem(0, 0, QTableWidgetItem('滤波类型'))
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.setItem(1, 0, QTableWidgetItem('半径r'))
+ self.setCellWidget(1, 1, self.ksize_SpinBox)
+ self.setItem(2, 0, QTableWidgetItem('带宽W'))
+ self.setCellWidget(2, 1, self.W_Spinbox)
+ self.setItem(3, 0, QTableWidgetItem('阶数n'))
+ self.setCellWidget(3, 1, self.n_Spinbox)
+ self.signal_connect()
+
+class ColorImageProcessTabledWidget(TableWidget):
+ def __init__(self, parent=None):
+ super(ColorImageProcessTabledWidget, self).__init__(parent=parent)
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['RGB模型', 'CMY模型','HSI模型','伪彩色变换'])
+ # self.kind_comBox.addItems(['彩色模型', '伪彩色变换', '真彩色变换'])
+ self.kind_comBox.setObjectName('kind')
+
+ # self.H_qslider = QSlider(Qt.Horizontal)
+ self.H_qslider = MyQSlider()
+ self.H_qslider.setOrientation(Qt.Horizontal)
+ self.H_qslider.setMinimum(0)
+ self.H_qslider.setMaximum(150)
+ self.H_qslider.setSingleStep(10)
+ self.H_qslider.setTickPosition(QSlider.TicksBelow)
+ self.H_qslider.setTickInterval(10)
+ self.H_qslider.setObjectName('H')
+
+ # self.S_qslider = QSlider(Qt.Horizontal)
+ self.S_qslider = MyQSlider()
+ self.S_qslider.setOrientation(Qt.Horizontal)
+ self.S_qslider.setMinimum(0)
+ self.S_qslider.setMaximum(150)
+ self.S_qslider.setSingleStep(10)
+ self.S_qslider.setTickPosition(QSlider.TicksBelow)
+ self.S_qslider.setTickInterval(10)
+ self.S_qslider.setObjectName('S')
+
+ # self.V_qslider = QSlider(Qt.Horizontal)
+ self.V_qslider = MyQSlider()
+ self.V_qslider.setOrientation(Qt.Horizontal)
+ self.V_qslider.setMinimum(0)
+ self.V_qslider.setMaximum(150)
+ self.V_qslider.setSingleStep(10)
+ self.V_qslider.setTickPosition(QSlider.TicksBelow)
+ self.V_qslider.setTickInterval(10)
+ self.V_qslider.setObjectName('V')
+
+ self.pseudoColor_comBox = QComboBox()
+ self.pseudoColor_comBox.addItems(['COLORMAP_AUTUMN', 'COLORMAP_BONE', 'COLORMAP_JET', 'COLORMAP_WINTER', 'COLORMAP_RAINBOW','COLORMAP_OCEAN','COLORMAP_SUMMER','COLORMAP_SPRING','COLORMAP_COOL','COLORMAP_HSV','COLORMAP_PINK','COLORMAP_HOT'])
+ # self.kind_comBox.addItems(['彩色模型', '伪彩色变换', '真彩色变换'])
+ self.pseudoColor_comBox.setObjectName('color_kind')
+
+
+ self.setColumnCount(2)
+ self.setRowCount(5)
+ self.setItem(0, 0, QTableWidgetItem('颜色变换'))
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.setItem(1, 0, QTableWidgetItem('B通道'))
+ self.setCellWidget(1, 1, self.H_qslider)
+ self.setItem(2, 0, QTableWidgetItem('G通道'))
+ self.setCellWidget(2, 1, self.S_qslider)
+ self.setItem(3, 0, QTableWidgetItem('R通道'))
+ self.setCellWidget(3, 1, self.V_qslider)
+ self.setItem(4, 0, QTableWidgetItem('伪彩色类型'))
+ self.setCellWidget(4, 1, self.pseudoColor_comBox)
+
+ self.signal_connect()
+
+
+class IdCardPicGenerateTabledWidget(TableWidget):
+ def __init__(self, parent=None):
+ super(IdCardPicGenerateTabledWidget, self).__init__(parent=parent)
+ self.kind_comBox = QComboBox()
+ self.kind_comBox.addItems(['蓝底', '红底','白底'])
+ self.kind_comBox.setObjectName('kind')
+ self.setColumnCount(2)
+ self.setRowCount(1)
+ self.setItem(0, 0, QTableWidgetItem('人像背景底色切换'))
+ self.setCellWidget(0, 1, self.kind_comBox)
+ self.signal_connect()
+
+class MyQSlider(QSlider):
+ def __init__(self,parent=None,*args,**kwargs):
+ super().__init__(parent,*args,**kwargs)
+ label = QLabel(self)
+ self.label = label
+ label.setText('100')
+ label.setStyleSheet('background-color:cyan;color:red')
+ label.hide()
+
+ def mousePressEvent(self, evt):
+ super().mousePressEvent(evt)
+ y = (1-((self.value()-self.minimum())/(self.maximum()-self.minimum())))*(self.height()-self.label.height())
+ x = (self.width()-self.label.width())/2
+ self.label.move(x,y)
+ self.label.show()
+ self.label.setText(str(self.value()))
+
+ def mouseMoveEvent(self, evt):
+ super().mouseMoveEvent(evt)
+ y = (1-((self.value()-self.minimum())/(self.maximum()-self.minimum())))*(self.height()-self.label.height())
+ x = (self.width()-self.label.width())/2
+ self.label.move(x,y)
+ self.label.setText(str(self.value()))
+ self.label.adjustSize()
+
+ def mouseReleaseEvent(self, evt):
+ super().mouseReleaseEvent(evt)
+ self.label.hide()
diff --git a/数字图像处理平台/custom/treeView.py b/数字图像处理平台/custom/treeView.py
new file mode 100644
index 0000000..c1076fb
--- /dev/null
+++ b/数字图像处理平台/custom/treeView.py
@@ -0,0 +1,33 @@
+from cv2 import imdecode
+import numpy as np
+from PyQt5.QtCore import Qt
+from PyQt5.QtWidgets import QTreeView, QDockWidget, QFileSystemModel
+
+
+class FileSystemTreeView(QTreeView, QDockWidget):
+ def __init__(self, parent=None):
+ super().__init__(parent=parent)
+ self.mainwindow = parent
+ self.fileSystemModel = QFileSystemModel()
+ self.fileSystemModel.setRootPath('.')
+ self.setModel(self.fileSystemModel)
+ # 隐藏size,date等列
+ self.setColumnWidth(0, 200)
+ self.setColumnHidden(1, True)
+ self.setColumnHidden(2, True)
+ self.setColumnHidden(3, True)
+ # 不显示标题栏
+ self.header().hide()
+ # 设置动画
+ self.setAnimated(True)
+ # 选中不显示虚线
+ self.setFocusPolicy(Qt.NoFocus)
+ self.doubleClicked.connect(self.select_image)
+ self.setMinimumWidth(200)
+
+ def select_image(self, file_index):
+ file_name = self.fileSystemModel.filePath(file_index)
+ if file_name.endswith(('.jpg', '.png', '.bmp')):
+ src_img = imdecode(np.fromfile(file_name, dtype=np.uint8), -1)
+ self.mainwindow.change_image(src_img)
+
diff --git a/数字图像处理平台/dlib-19.17.99-cp37-cp37m-win_amd64.whl b/数字图像处理平台/dlib-19.17.99-cp37-cp37m-win_amd64.whl
new file mode 100644
index 0000000..208551b
Binary files /dev/null and b/数字图像处理平台/dlib-19.17.99-cp37-cp37m-win_amd64.whl differ
diff --git a/数字图像处理平台/flags.py b/数字图像处理平台/flags.py
new file mode 100644
index 0000000..60eb7a9
--- /dev/null
+++ b/数字图像处理平台/flags.py
@@ -0,0 +1,125 @@
+import cv2
+
+GRAYING_STACKED_WIDGET = 0
+FILTER_STACKED_WIDGET = 1
+MORPH_STACKED_WIDGET = 2
+GRAD_STACKED_WIDGET = 3
+THRESH_STACKED_WIDGET = 4
+EDGE_STACKED_WIDGET = 5
+
+# 功能区
+
+BGR2GRAY_COLOR = 0
+GRAY2BGR_COLOR = 1
+COLOR = {
+ BGR2GRAY_COLOR: cv2.COLOR_BGR2GRAY,
+ GRAY2BGR_COLOR: cv2.COLOR_GRAY2BGR
+}
+
+# 图像灰度处理
+RBG2GRAY = 0
+REVERSE = 1
+PLTRANS = 2
+Binarization = 3
+
+
+
+
+
+
+
+MEAN_FILTER = 0
+GAUSSIAN_FILTER = 1
+MEDIAN_FILTER = 2
+
+ERODE_MORPH_OP = 0
+DILATE_MORPH_OP = 1
+OPEN_MORPH_OP = 2
+CLOSE_MORPH_OP = 3
+GRADIENT_MORPH_OP = 4
+TOPHAT_MORPH_OP = 5
+BLACKHAT_MORPH_OP = 6
+
+MORPH_OP = {
+ ERODE_MORPH_OP: cv2.MORPH_ERODE,
+ DILATE_MORPH_OP: cv2.MORPH_DILATE,
+ OPEN_MORPH_OP: cv2.MORPH_OPEN,
+ CLOSE_MORPH_OP: cv2.MORPH_CLOSE,
+ GRADIENT_MORPH_OP: cv2.MORPH_GRADIENT,
+ TOPHAT_MORPH_OP: cv2.MORPH_TOPHAT,
+ BLACKHAT_MORPH_OP: cv2.MORPH_BLACKHAT
+}
+
+RECT_MORPH_SHAPE = 0
+CROSS_MORPH_SHAPE = 1
+ELLIPSE_MORPH_SHAPE = 2
+
+MORPH_SHAPE = {
+ RECT_MORPH_SHAPE: cv2.MORPH_RECT,
+ CROSS_MORPH_SHAPE: cv2.MORPH_CROSS,
+ ELLIPSE_MORPH_SHAPE: cv2.MORPH_ELLIPSE
+}
+
+SOBEL_GRAD = 0
+SCHARR_GRAD = 1
+LAPLACIAN_GRAD = 2
+
+BINARY_THRESH_METHOD = 0
+BINARY_INV_THRESH_METHOD = 1
+TRUNC_THRESH_METHOD = 2
+TOZERO_THRESH_METHOD = 3
+TOZERO_INV_THRESH_METHOD = 4
+OTSU_THRESH_METHOD = 5
+THRESH_METHOD = {
+ BINARY_THRESH_METHOD: cv2.THRESH_BINARY, # 0
+ BINARY_INV_THRESH_METHOD: cv2.THRESH_BINARY_INV, # 1
+ TRUNC_THRESH_METHOD: cv2.THRESH_TRUNC, # 2
+ TOZERO_THRESH_METHOD: cv2.THRESH_TOZERO, # 3
+ TOZERO_INV_THRESH_METHOD: cv2.THRESH_TOZERO_INV, # 4
+ OTSU_THRESH_METHOD: cv2.THRESH_OTSU # 5
+}
+
+EXTERNAL_CONTOUR_MODE = 0
+LIST_CONTOUR_MODE = 1
+CCOMP_CONTOUR_MODE = 2
+TREE_CONTOUR_MODE = 3
+CONTOUR_MODE = {
+ EXTERNAL_CONTOUR_MODE: cv2.RETR_EXTERNAL,
+ LIST_CONTOUR_MODE: cv2.RETR_LIST,
+ CCOMP_CONTOUR_MODE: cv2.RETR_CCOMP,
+ TREE_CONTOUR_MODE: cv2.RETR_TREE
+}
+
+NONE_CONTOUR_METHOD = 0
+SIMPLE_CONTOUR_METHOD = 1
+CONTOUR_METHOD = {
+ NONE_CONTOUR_METHOD: cv2.CHAIN_APPROX_NONE,
+ SIMPLE_CONTOUR_METHOD: cv2.CHAIN_APPROX_SIMPLE
+}
+
+NORMAL_CONTOUR = 0
+RECT_CONTOUR = 1
+MINRECT_CONTOUR = 2
+MINCIRCLE_CONTOUR = 3
+
+
+# 均衡化
+BLUE_CHANNEL = 0
+GREEN_CHANNEL = 1
+RED_CHANNEL = 2
+ALL_CHANNEL = 3
+
+
+# 伪彩色变换
+COLORMAP_AUTUMN = 0
+COLORMAP_BONE = 1
+COLORMAP_JET = 2
+COLORMAP_WINTER = 3
+COLORMAP_RAINBOW = 4
+COLORMAP_OCEAN = 5
+COLORMAP_SUMMER = 6
+COLORMAP_SPRING = 7
+COLORMAP_COOL = 8
+COLORMAP_HSV = 9
+COLORMAP_PINK = 10
+COLORMAP_HOT = 11
\ No newline at end of file
diff --git a/数字图像处理平台/function/AddNoise/ExponentialNoise.py b/数字图像处理平台/function/AddNoise/ExponentialNoise.py
new file mode 100644
index 0000000..187d1e5
--- /dev/null
+++ b/数字图像处理平台/function/AddNoise/ExponentialNoise.py
@@ -0,0 +1,15 @@
+# import numpy as np
+from numpy import array,random,clip,uint8
+
+def exponential_noise(image, scale = 0.1):
+
+ image = array(image/255, dtype=float)
+ noise = random.exponential(scale,image.shape)
+ out = image + noise
+ if out.min() < 0:
+ low_clip = -1.
+ else:
+ low_clip = 0.
+ out = clip(out, low_clip, 1.0)
+ out = uint8(out*255)
+ return out
\ No newline at end of file
diff --git a/数字图像处理平台/function/AddNoise/GammaNoise.py b/数字图像处理平台/function/AddNoise/GammaNoise.py
new file mode 100644
index 0000000..535e48a
--- /dev/null
+++ b/数字图像处理平台/function/AddNoise/GammaNoise.py
@@ -0,0 +1,17 @@
+# import numpy as np
+# import cv2
+from numpy import array,random,clip,uint8
+
+def gamma_noise(image, var=0.1):
+
+ image = array(image/255, dtype=float)
+ # 伽马分布
+ noise = random.gamma(3,var ** 0.5, image.shape)
+ out = image + noise
+ if out.min() < 0:
+ low_clip = -1.
+ else:
+ low_clip = 0.
+ out = clip(out, low_clip, 1.0)
+ out = uint8(out*255)
+ return out
\ No newline at end of file
diff --git a/数字图像处理平台/function/AddNoise/GasussNoise.py b/数字图像处理平台/function/AddNoise/GasussNoise.py
new file mode 100644
index 0000000..97f32c8
--- /dev/null
+++ b/数字图像处理平台/function/AddNoise/GasussNoise.py
@@ -0,0 +1,17 @@
+# import numpy as np
+# import cv2
+from numpy import array,random,clip,uint8
+
+def gasuss_noise(image, var=0.1, mean=0):
+
+ image = array(image/255, dtype=float)
+ # 高斯分布
+ noise = random.normal(mean, var ** 0.5, image.shape)
+ out = image + noise
+ if out.min() < 0:
+ low_clip = -1.
+ else:
+ low_clip = 0.
+ out = clip(out, low_clip, 1.0)
+ out = uint8(out*255)
+ return out
diff --git a/数字图像处理平台/function/AddNoise/ImpluseNoise.py b/数字图像处理平台/function/AddNoise/ImpluseNoise.py
new file mode 100644
index 0000000..4ed499c
--- /dev/null
+++ b/数字图像处理平台/function/AddNoise/ImpluseNoise.py
@@ -0,0 +1,19 @@
+from random import random
+from numpy import zeros,uint8,random
+import cv2
+
+def impluse_noise(image,prob=0.1):
+
+ output = zeros(image.shape,uint8)
+ thres = 1 - prob
+ for i in range(image.shape[0]):
+ for j in range(image.shape[1]):
+ rdn = random.random()
+ if rdn < prob:
+ output[i][j] = 0
+ elif rdn > thres:
+ output[i][j] = 255
+ else:
+ output[i][j] = image[i][j]
+ return output
+
diff --git a/数字图像处理平台/function/AddNoise/RayleighNoise.py b/数字图像处理平台/function/AddNoise/RayleighNoise.py
new file mode 100644
index 0000000..fb6a988
--- /dev/null
+++ b/数字图像处理平台/function/AddNoise/RayleighNoise.py
@@ -0,0 +1,16 @@
+# import numpy as np
+from numpy import array,clip,uint8
+from numpy.random import rayleigh
+def rayleigh_noise(image,var=0.1):
+
+ image = array(image/255, dtype=float)
+ # 瑞利分布
+ noise = rayleigh(var ** 0.5, image.shape)
+ out = image + noise
+ if out.min() < 0:
+ low_clip = -1.
+ else:
+ low_clip = 0.
+ out = clip(out, low_clip, 1.0)
+ out = uint8(out*255)
+ return out
diff --git a/数字图像处理平台/function/AddNoise/UniformNoise.py b/数字图像处理平台/function/AddNoise/UniformNoise.py
new file mode 100644
index 0000000..4f87a1c
--- /dev/null
+++ b/数字图像处理平台/function/AddNoise/UniformNoise.py
@@ -0,0 +1,15 @@
+from numpy import array,clip,uint8
+from numpy.random import uniform
+def uniform_noise(image,hight=1.0,low=0.0):
+
+ image = array(image/255, dtype=float)
+ # 均匀分布
+ noise = uniform(low,hight,image.shape)
+ out = image + noise
+ if out.min() < 0:
+ low_clip = -1.
+ else:
+ low_clip = 0.
+ out = clip(out, low_clip, 1.0)
+ out = uint8(out*255)
+ return out
diff --git a/数字图像处理平台/function/AddNoise/__init__.py b/数字图像处理平台/function/AddNoise/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/ExponentialNoise.cpython-37.pyc b/数字图像处理平台/function/AddNoise/__pycache__/ExponentialNoise.cpython-37.pyc
new file mode 100644
index 0000000..4aff49a
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/ExponentialNoise.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/ExponentialNoise.cpython-38.pyc b/数字图像处理平台/function/AddNoise/__pycache__/ExponentialNoise.cpython-38.pyc
new file mode 100644
index 0000000..25b7f61
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/ExponentialNoise.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/GammaNoise.cpython-37.pyc b/数字图像处理平台/function/AddNoise/__pycache__/GammaNoise.cpython-37.pyc
new file mode 100644
index 0000000..b26eb09
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/GammaNoise.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/GammaNoise.cpython-38.pyc b/数字图像处理平台/function/AddNoise/__pycache__/GammaNoise.cpython-38.pyc
new file mode 100644
index 0000000..797e3f6
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/GammaNoise.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/GasussNoise.cpython-37.pyc b/数字图像处理平台/function/AddNoise/__pycache__/GasussNoise.cpython-37.pyc
new file mode 100644
index 0000000..0edc66e
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/GasussNoise.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/GasussNoise.cpython-38.pyc b/数字图像处理平台/function/AddNoise/__pycache__/GasussNoise.cpython-38.pyc
new file mode 100644
index 0000000..8da1dda
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/GasussNoise.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/ImpluseNoise.cpython-37.pyc b/数字图像处理平台/function/AddNoise/__pycache__/ImpluseNoise.cpython-37.pyc
new file mode 100644
index 0000000..7068029
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/ImpluseNoise.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/ImpluseNoise.cpython-38.pyc b/数字图像处理平台/function/AddNoise/__pycache__/ImpluseNoise.cpython-38.pyc
new file mode 100644
index 0000000..ad43621
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/ImpluseNoise.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/RayleighNoise.cpython-37.pyc b/数字图像处理平台/function/AddNoise/__pycache__/RayleighNoise.cpython-37.pyc
new file mode 100644
index 0000000..1e09f67
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/RayleighNoise.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/RayleighNoise.cpython-38.pyc b/数字图像处理平台/function/AddNoise/__pycache__/RayleighNoise.cpython-38.pyc
new file mode 100644
index 0000000..08b1ab2
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/RayleighNoise.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/UniformNoise.cpython-37.pyc b/数字图像处理平台/function/AddNoise/__pycache__/UniformNoise.cpython-37.pyc
new file mode 100644
index 0000000..6395904
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/UniformNoise.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/UniformNoise.cpython-38.pyc b/数字图像处理平台/function/AddNoise/__pycache__/UniformNoise.cpython-38.pyc
new file mode 100644
index 0000000..1fe7b69
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/UniformNoise.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/__init__.cpython-37.pyc b/数字图像处理平台/function/AddNoise/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..2d7e43f
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/__init__.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/AddNoise/__pycache__/__init__.cpython-38.pyc b/数字图像处理平台/function/AddNoise/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..1a93d12
Binary files /dev/null and b/数字图像处理平台/function/AddNoise/__pycache__/__init__.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/Beauty/Beauty.py b/数字图像处理平台/function/Beauty/Beauty.py
new file mode 100644
index 0000000..88182db
--- /dev/null
+++ b/数字图像处理平台/function/Beauty/Beauty.py
@@ -0,0 +1,27 @@
+import cv2
+import numpy as np
+def Beauty(img):
+ step = 5
+ kernel = (32,32) #图片大一点,此处尺寸大一点
+
+ img = img/255.0
+ sz = img.shape[:2]
+ sz1 = (int(round(sz[1] * step)), int(round(sz[0] * step)))
+ sz2 = (int(round(kernel[0] * step)), int(round(kernel[0] * step)))
+ sI = cv2.resize(img, sz1, interpolation=cv2.INTER_LINEAR)
+ sp = cv2.resize(img, sz1, interpolation=cv2.INTER_LINEAR)
+ msI = cv2.blur(sI, sz2)
+ msp = cv2.blur(sp, sz2)
+ msII = cv2.blur(sI*sI, sz2)
+ msIp = cv2.blur(sI*sp, sz2)
+ vsI = msII - msI*msI
+ csIp = msIp - msI*msp
+ recA = csIp/(vsI+0.01)
+ recB = msp - recA*msI
+ mA = cv2.resize(recA, (sz[1],sz[0]), interpolation=cv2.INTER_LINEAR)
+ mB = cv2.resize(recB, (sz[1],sz[0]), interpolation=cv2.INTER_LINEAR)
+ gf = mA*img + mB
+ gf = gf*255
+ gf[gf>255] = 255
+ final = gf.astype(np.uint8)
+ return final
\ No newline at end of file
diff --git a/数字图像处理平台/function/Beauty/__init__.py b/数字图像处理平台/function/Beauty/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/数字图像处理平台/function/Beauty/__pycache__/Beauty.cpython-37.pyc b/数字图像处理平台/function/Beauty/__pycache__/Beauty.cpython-37.pyc
new file mode 100644
index 0000000..31d63ee
Binary files /dev/null and b/数字图像处理平台/function/Beauty/__pycache__/Beauty.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/Beauty/__pycache__/__init__.cpython-37.pyc b/数字图像处理平台/function/Beauty/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..46b7529
Binary files /dev/null and b/数字图像处理平台/function/Beauty/__pycache__/__init__.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/ColorImageProcess/HSIProcess.py b/数字图像处理平台/function/ColorImageProcess/HSIProcess.py
new file mode 100644
index 0000000..0227863
--- /dev/null
+++ b/数字图像处理平台/function/ColorImageProcess/HSIProcess.py
@@ -0,0 +1,62 @@
+import cv2
+import numpy as np
+
+
+def hsvProcess(img,h_value,s_value,v_value):
+
+ h_value = float(h_value/100)
+ s_value = float(s_value/100)
+ v_value = float(v_value/100)
+ if img.shape[2] == 4:
+ img = cv2.cvtColor(img, cv2.COLOR_RGBA2RGB)
+ H, S, V = cv2.split(img) # (b,g,r)
+ new_pic = cv2.merge([np.uint8(H * h_value), np.uint8(S * s_value), np.uint8(V * v_value)])
+ return new_pic
+
+
+
+
+def rgb2hsi(rgb_img,h_value,s_value,i_value):
+ h_value = float(h_value / 100)
+ s_value = float(s_value / 100)
+ i_value = float(i_value / 100)
+ if rgb_img.shape[2] == 4:
+ img = cv2.cvtColor(rgb_img, cv2.COLOR_RGBA2RGB)
+ rows = int(rgb_img.shape[0])
+ cols = int(rgb_img.shape[1])
+ b, g, r = cv2.split(img)
+ # 归一化到[0,1]
+ b = b / 255.0
+ g = g / 255.0
+ r = r / 255.0
+ hsi_img = img.copy()
+ H, S, I = cv2.split(hsi_img)
+ for i in range(rows):
+ for j in range(cols):
+ # 获得theta值
+ num = 0.5 * ((r[i, j]-g[i, j])+(r[i, j]-b[i, j]))
+ den = np.sqrt((r[i, j]-g[i, j])**2+(r[i, j]-b[i, j])*(g[i, j]-b[i, j]))
+ theta = float(np.arccos(num/den))
+ if den == 0:
+ H = 0
+ elif b[i, j] <= g[i, j]:
+ H = theta
+ else:
+ H = 2*3.14169265 - theta
+ min_RGB = min(min(b[i, j], g[i, j]), r[i, j])
+ sum = b[i, j]+g[i, j]+r[i, j]
+ if sum == 0:
+ S = 0
+ else:
+ S = 1 - 3*min_RGB/sum
+ # 归一到0-1之间
+ H = H/(2*3.14159265)
+ I = sum/3.0
+ # 输出HSI图像,扩充到255以方便显示,一般H分量在[0,2pi]之间,S和I在[0,1]之间
+ hsi_img[i, j, 0] = H*255
+ hsi_img[i, j, 1] = S*255
+ hsi_img[i, j, 2] = I*255
+ hsi_img[:,:,0] = hsi_img[:,:,0]*h_value
+ hsi_img[:,:,1] = hsi_img[:,:,0]*s_value
+ hsi_img[:,:,1] = hsi_img[:,:,0]*i_value
+ return hsi_img
diff --git a/数字图像处理平台/function/ColorImageProcess/PseudoColorTrans.py b/数字图像处理平台/function/ColorImageProcess/PseudoColorTrans.py
new file mode 100644
index 0000000..30778f0
--- /dev/null
+++ b/数字图像处理平台/function/ColorImageProcess/PseudoColorTrans.py
@@ -0,0 +1,46 @@
+import cv2
+
+from function.GrayscaleTrans.BGR2GRAY import rgbToGray
+from function.ColorImageProcess.HSIProcess import hsvProcess
+
+
+def pseudoColorTrans(img,H,S,V,type):
+ if img.shape == 4:
+ img = cv2.cvtColor(img,cv2.COLOR_RGBA2BGR)
+ img_gray = rgbToGray(img)
+ if type == 0:
+ img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_AUTUMN)
+ elif type == 1:
+ img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_BONE)
+ elif type == 2:
+ img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_JET)
+ elif type == 3:
+ img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_WINTER)
+ elif type == 4:
+ img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_RAINBOW)
+ elif type == 5:
+ img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_OCEAN)
+ elif type == 6:
+ img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_SUMMER)
+ elif type == 7:
+ img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_SPRING)
+ elif type == 8:
+ img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_COOL)
+ elif type == 9:
+ img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_HSV)
+ elif type == 10:
+ img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_PINK)
+ elif type == 11:
+ img_color = cv2.applyColorMap(img_gray, cv2.COLORMAP_HOT)
+ img_color = hsvProcess(img_color,H,S,V)
+ return img_color
+
+
+# img_gray = cv2.imread("../pic/beach.png",cv2.IMREAD_GRAYSCALE)
+# img_color = cv2.applyColorMap(img_gray,cv2.COLORMAP_JET)
+# img = cv2.imread('../pic/beach.png')
+# img_gray = pseudoColorTrans(img,type)
+# cv2.imshow('img_color',img_gray)
+# cv2.waitKey(0)
+# cv2.imshow('img_color',img_color)
+# cv2.waitKey(0)
\ No newline at end of file
diff --git a/数字图像处理平台/function/ColorImageProcess/RGB2CMY.py b/数字图像处理平台/function/ColorImageProcess/RGB2CMY.py
new file mode 100644
index 0000000..78a111d
--- /dev/null
+++ b/数字图像处理平台/function/ColorImageProcess/RGB2CMY.py
@@ -0,0 +1,16 @@
+import cv2
+from function.ColorImageProcess.HSIProcess import hsvProcess
+
+
+def rgb2cmy(img,H,S,V):
+ if img.shape[2] == 4:
+ img = cv2.cvtColor(img,cv2.COLOR_RGBA2RGB)
+ (b,g,r) = cv2.split(img)
+ b = 1 - b/b.max()
+ g = 1 - g/g.max()
+ r = 1 - r/r.max()
+ img_1 = cv2.merge([255*b,255*g,255*r])
+ img_result = hsvProcess(img_1,H,S,V)
+ return img_result
+
+
diff --git a/数字图像处理平台/function/ColorImageProcess/__init__.py b/数字图像处理平台/function/ColorImageProcess/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/数字图像处理平台/function/ColorImageProcess/__pycache__/HSIProcess.cpython-37.pyc b/数字图像处理平台/function/ColorImageProcess/__pycache__/HSIProcess.cpython-37.pyc
new file mode 100644
index 0000000..d1dd373
Binary files /dev/null and b/数字图像处理平台/function/ColorImageProcess/__pycache__/HSIProcess.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/ColorImageProcess/__pycache__/HSIProcess.cpython-38.pyc b/数字图像处理平台/function/ColorImageProcess/__pycache__/HSIProcess.cpython-38.pyc
new file mode 100644
index 0000000..d388e6e
Binary files /dev/null and b/数字图像处理平台/function/ColorImageProcess/__pycache__/HSIProcess.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/ColorImageProcess/__pycache__/PseudoColorTrans.cpython-37.pyc b/数字图像处理平台/function/ColorImageProcess/__pycache__/PseudoColorTrans.cpython-37.pyc
new file mode 100644
index 0000000..52d90e6
Binary files /dev/null and b/数字图像处理平台/function/ColorImageProcess/__pycache__/PseudoColorTrans.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/ColorImageProcess/__pycache__/PseudoColorTrans.cpython-38.pyc b/数字图像处理平台/function/ColorImageProcess/__pycache__/PseudoColorTrans.cpython-38.pyc
new file mode 100644
index 0000000..61a92fc
Binary files /dev/null and b/数字图像处理平台/function/ColorImageProcess/__pycache__/PseudoColorTrans.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/ColorImageProcess/__pycache__/RGB2CMY.cpython-37.pyc b/数字图像处理平台/function/ColorImageProcess/__pycache__/RGB2CMY.cpython-37.pyc
new file mode 100644
index 0000000..862c244
Binary files /dev/null and b/数字图像处理平台/function/ColorImageProcess/__pycache__/RGB2CMY.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/ColorImageProcess/__pycache__/RGB2CMY.cpython-38.pyc b/数字图像处理平台/function/ColorImageProcess/__pycache__/RGB2CMY.cpython-38.pyc
new file mode 100644
index 0000000..fbe59a5
Binary files /dev/null and b/数字图像处理平台/function/ColorImageProcess/__pycache__/RGB2CMY.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/ColorImageProcess/__pycache__/__init__.cpython-37.pyc b/数字图像处理平台/function/ColorImageProcess/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..47010e3
Binary files /dev/null and b/数字图像处理平台/function/ColorImageProcess/__pycache__/__init__.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/ColorImageProcess/__pycache__/__init__.cpython-38.pyc b/数字图像处理平台/function/ColorImageProcess/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..4ed9ebd
Binary files /dev/null and b/数字图像处理平台/function/ColorImageProcess/__pycache__/__init__.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/FrequencyDomainFilter/ButterWorthFilter.py b/数字图像处理平台/function/FrequencyDomainFilter/ButterWorthFilter.py
new file mode 100644
index 0000000..86ac889
--- /dev/null
+++ b/数字图像处理平台/function/FrequencyDomainFilter/ButterWorthFilter.py
@@ -0,0 +1,75 @@
+
+import cv2
+import numpy as np
+from function.GrayscaleTrans.BGR2GRAY import rgbToGray
+
+
+def make_transform_matrix(image,d,s1,n):
+ transfor_matrix = np.zeros(image.shape)
+ center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))
+ for i in range(transfor_matrix.shape[0]):
+ for j in range(transfor_matrix.shape[1]):
+ def cal_distance(pa, pb):
+ from math import sqrt
+ dis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)
+ return dis
+
+ dis = cal_distance(center_point, (i, j))
+ transfor_matrix[i, j] = 1 / ((1 + (dis / d)) ** (2 * n))
+ return transfor_matrix
+
+
+def butterworthFilter(image, d, n,kind):
+ '''
+ 巴特沃斯低通滤波器
+ :param image: 输入图像
+ :param d: 滤波半径
+ :param n: 阶数
+ :return:
+ '''
+ image = cv2.cvtColor(image, cv2.COLOR_RGBA2BGR)
+ image = rgbToGray(image)
+ f = np.fft.fft2(image)
+ fshift = np.fft.fftshift(f)
+ s1 = np.log(np.abs(fshift))
+ if kind == 1:
+ d_matrix = make_transform_matrix(image,d,s1,n)
+ elif kind == 4:
+ d_matrix = 1-make_transform_matrix(image, d, s1, n)
+ img_d1 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))
+ # 高通滤波
+ # img_d1 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * (1-d_matrix))))
+ img_d1 = img_d1 / img_d1.max()
+ img_d1 = img_d1 * 255
+ img_d1 = img_d1.astype(np.uint8)
+ return img_d1
+
+
+# 定义函数,巴特沃斯带阻/通滤波模板
+def ButterworthBand(src, w, d0, n):
+ template = np.zeros(src.shape, dtype=np.float32) # 构建滤波器
+ r, c = src.shape
+ for i in np.arange(r):
+ for j in np.arange(c):
+ distance = np.sqrt((i - r / 2) ** 2 + (j - c / 2) ** 2)
+ # 巴特沃斯分布
+ template[i, j] = 1/(1+(distance*w/(distance**2 - d0**2))**(2*n))
+ return template
+
+
+def butterworthSelectFilter(image, d, n,W,kind):
+ image = cv2.cvtColor(image, cv2.COLOR_RGBA2BGR)
+ image = rgbToGray(image) # 图像灰度化
+ f = np.fft.fft2(image) # 图像的傅里叶变换
+ fshift = np.fft.fftshift(f) # 将低频移动到中心
+ s1 = np.log(np.abs(fshift))
+ if kind == 1: # 巴特沃斯带阻滤波器
+ d_matrix = ButterworthBand(image,W,d,n)
+ elif kind == 4: # 巴特沃斯带通滤波器
+ d_matrix = 1-ButterworthBand(image, W, d, n)
+ # 与模板相乘后再傅里叶逆变换
+ img_d1 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d_matrix)))
+ img_d1 = img_d1 / img_d1.max()
+ img_d1 = img_d1 * 255
+ img_d1 = img_d1.astype(np.uint8)
+ return img_d1
diff --git a/数字图像处理平台/function/FrequencyDomainFilter/GaussianFrequencyFilter.py b/数字图像处理平台/function/FrequencyDomainFilter/GaussianFrequencyFilter.py
new file mode 100644
index 0000000..02e630b
--- /dev/null
+++ b/数字图像处理平台/function/FrequencyDomainFilter/GaussianFrequencyFilter.py
@@ -0,0 +1,66 @@
+
+import cv2
+import numpy as np
+from function.GrayscaleTrans.BGR2GRAY import rgbToGray
+
+# 高斯滤波器模板
+def make_transform_matrix(d,image,s1):
+ transfor_matrix = np.zeros(image.shape)
+ center_point = tuple(map(lambda x: (x - 1) / 2, s1.shape))
+ for i in range(transfor_matrix.shape[0]):
+ for j in range(transfor_matrix.shape[1]):
+ def cal_distance(pa, pb):
+ from math import sqrt
+ dis = sqrt((pa[0] - pb[0]) ** 2 + (pa[1] - pb[1]) ** 2)
+ return dis
+
+ dis = cal_distance(center_point, (i, j))
+ transfor_matrix[i, j] = np.exp(-(dis ** 2) / (2 * (d ** 2)))
+ return transfor_matrix
+
+def GaussianFilter(image,d,kind):
+ image = cv2.cvtColor(image, cv2.COLOR_RGBA2BGR)
+ image = rgbToGray(image)
+ f = np.fft.fft2(image)
+ fshift = np.fft.fftshift(f)
+ s1 = np.log(np.abs(fshift))
+ if kind == 2:
+ d_matrix = make_transform_matrix(d,image,s1)
+ elif kind == 5:
+ d_matrix = 1-make_transform_matrix(d,image,s1)
+ img_d1 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
+ img_d1 = img_d1 / img_d1.max()
+ img_d1 = img_d1 * 255
+ img_d1 = img_d1.astype(np.uint8)
+ return img_d1
+
+
+# 定义函数,高斯带阻/通滤波模板
+def GaussianBand(src, w, d0):
+ template = np.zeros(src.shape, dtype=np.float32) # 构建滤波器
+ r, c = src.shape
+ for i in np.arange(r):
+ for j in np.arange(c):
+ distance = np.sqrt((i - r / 2) ** 2 + (j - c / 2) ** 2)
+ temp = ((distance**2 - d0**2)/(distance*w+0.00000001))**2
+ template[i, j] = 1 - np.exp(-0.5 * temp)
+ return template
+
+def GaussianSelectFilter(image,d,W,kind):
+ image = cv2.cvtColor(image, cv2.COLOR_RGBA2BGR)
+ image = rgbToGray(image)
+ f = np.fft.fft2(image)
+ fshift = np.fft.fftshift(f)
+ s1 = np.log(np.abs(fshift))
+ if kind == 2: # 高斯带阻滤波器
+ d_matrix = GaussianBand(image,W,d)
+ elif kind == 5: # 高斯带通滤波器
+ d_matrix = 1-GaussianBand(image,W,d)
+ img_d1 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift*d_matrix)))
+ img_d1 = img_d1 / img_d1.max()
+ img_d1 = img_d1 * 255
+ img_d1 = img_d1.astype(np.uint8)
+ return img_d1
+
+
+
diff --git a/数字图像处理平台/function/FrequencyDomainFilter/IdealFilter.py b/数字图像处理平台/function/FrequencyDomainFilter/IdealFilter.py
new file mode 100644
index 0000000..a1d946d
--- /dev/null
+++ b/数字图像处理平台/function/FrequencyDomainFilter/IdealFilter.py
@@ -0,0 +1,139 @@
+import numpy as np
+import cv2
+from function.GrayscaleTrans.BGR2GRAY import rgbToGray
+
+def make_transform_matrix(d,image,s1):
+
+ transfor_matrix = np.zeros(image.shape)
+ center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
+ for i in range(transfor_matrix.shape[0]):
+ for j in range(transfor_matrix.shape[1]):
+ def cal_distance(pa,pb):
+ from math import sqrt
+ dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
+ return dis
+ dis = cal_distance(center_point,(i,j))
+ if dis <= d:
+ transfor_matrix[i,j]=1
+ else:
+ transfor_matrix[i,j]=0
+ return transfor_matrix
+
+def idealFilter(img,r,kind):
+ '''
+ 理想滤波器
+ :param img: 输入图像
+ :param r: 滤波器半径
+ :param kind: 滤波器类型
+ :return: 滤波后的图像
+ '''
+ img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR) # 四维转三维
+ img = rgbToGray(img) # 灰度化
+ f = np.fft.fft2(img) # 傅里叶变换
+ fshift = np.fft.fftshift(f) # 将低频部分移到中心
+ # 取绝对值:将复数变化成实数
+ # 取对数的目的为了将数据变化到0-255
+ s1 = np.log(np.abs(fshift))
+ # d1 = make_transform_matrix(r, fshift, s1)
+ if kind == 0: # 理想低通滤波
+ d1 = make_transform_matrix(r, fshift, s1)
+ elif kind == 3: # 理想高通滤波
+ d1 = 1-make_transform_matrix(r, fshift, s1)
+ img_d1 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d1)))
+ img_d1 = img_d1 / img_d1.max()
+ img_d1 = img_d1 * 255
+ img_d1 = img_d1.astype(np.uint8)
+ return img_d1
+
+
+def make_select_matrix(d,image,s1,W):
+ """
+ 构建理想选择滤波器
+ :param d: 滤波器半径
+ :param image: 图像的傅里叶变换
+ :return:
+ """
+ transfor_matrix = np.zeros(image.shape)
+ center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
+ for i in range(transfor_matrix.shape[0]):
+ for j in range(transfor_matrix.shape[1]):
+ def cal_distance(pa,pb):
+ from math import sqrt
+ dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2) # 计算两点之间距离
+ return dis
+ dis = cal_distance(center_point,(i,j))
+ # if dis <= d + W/2 and dis >= d - W/2:
+ if dis <= d + W and dis >= d:
+ transfor_matrix[i,j]=0
+ else:
+ transfor_matrix[i,j]=1
+ return transfor_matrix
+
+def idealSelectFilter(img,r,W,kind):
+ img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR)
+ img = rgbToGray(img)
+ # 傅里叶变换
+ f = np.fft.fft2(img)
+ # 将低频部分移到中心
+ fshift = np.fft.fftshift(f)
+ # 取绝对值:将复数变化成实数
+ # 取对数的目的为了将数据变化到0-255
+ s1 = np.log(np.abs(fshift))
+ if kind == 0: # 理想带阻滤波器
+ d1 = make_select_matrix(r, fshift, s1, W)
+ elif kind == 3: # 理想带通滤波器
+ d1 = 1-make_select_matrix(r, fshift, s1, W)
+ # 与模板相乘后再傅里叶逆变换
+ img_d1 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d1)))
+ img_d1 = img_d1 / img_d1.max()
+ img_d1 = img_d1 * 255
+ img_d1 = img_d1.astype(np.uint8)
+ return img_d1
+
+def make_NotchFilter_matrix(d,image,s1):
+ """
+ 构建理想陷波滤波器
+ :param d: 滤波器半径
+ :param image: 图像的傅里叶变换
+ :return:
+ """
+ transfor_matrix = np.zeros(image.shape)
+ # center_point = tuple(map(lambda x:(x-1)/2,s1.shape))
+ center_point_1 = (s1.shape[0]/4,s1.shape[1]/2)
+ center_point_2 = (3*s1.shape[0]/4,s1.shape[1]/2)
+ for i in range(transfor_matrix.shape[0]):
+ for j in range(transfor_matrix.shape[1]):
+ def cal_distance(pa,pb):
+ from math import sqrt
+ dis = sqrt((pa[0]-pb[0])**2+(pa[1]-pb[1])**2)
+ return dis
+ dis_1 = cal_distance(center_point_1,(i,j))
+ dis_2 = cal_distance(center_point_2,(i,j))
+ # if dis <= d + W/2 and dis >= d - W/2:
+ # if dis <= d + W and dis >= d:
+ if dis_1 <= d or dis_2 <= d:
+ transfor_matrix[i,j]=0
+ else:
+ transfor_matrix[i,j]=1
+ return transfor_matrix
+
+def idealNotchFilter(img,r,kind):
+ img = cv2.cvtColor(img, cv2.COLOR_RGBA2BGR)
+ img = rgbToGray(img)
+ # 傅里叶变换
+ f = np.fft.fft2(img)
+ # 将低频部分移到中心
+ fshift = np.fft.fftshift(f)
+ # fshift = fshift.astype(np.uint8)
+ # 取绝对值:将复数变化成实数
+ # 取对数的目的为了将数据变化到0-255
+ s1 = np.log(np.abs(fshift))
+ if kind == 6:
+ d1 = make_NotchFilter_matrix(r, fshift, s1)
+ elif kind == 7:
+ d1 = 1-make_NotchFilter_matrix(r, fshift, s1)
+ img_d1 = np.abs(np.fft.ifft2(np.fft.ifftshift(fshift * d1)))
+ img_d1 = img_d1 / img_d1.max()
+ img_d1 = img_d1 * 255
+ img_d1 = img_d1.astype(np.uint8)
+ return img_d1
diff --git a/数字图像处理平台/function/FrequencyDomainFilter/__init__.py b/数字图像处理平台/function/FrequencyDomainFilter/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/ButterWorthFilter.cpython-37.pyc b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/ButterWorthFilter.cpython-37.pyc
new file mode 100644
index 0000000..6c8016a
Binary files /dev/null and b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/ButterWorthFilter.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/ButterWorthFilter.cpython-38.pyc b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/ButterWorthFilter.cpython-38.pyc
new file mode 100644
index 0000000..630177f
Binary files /dev/null and b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/ButterWorthFilter.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/GaussianFrequencyFilter.cpython-37.pyc b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/GaussianFrequencyFilter.cpython-37.pyc
new file mode 100644
index 0000000..4ba3f72
Binary files /dev/null and b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/GaussianFrequencyFilter.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/GaussianFrequencyFilter.cpython-38.pyc b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/GaussianFrequencyFilter.cpython-38.pyc
new file mode 100644
index 0000000..fdb7d7d
Binary files /dev/null and b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/GaussianFrequencyFilter.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/IdealFilter.cpython-37.pyc b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/IdealFilter.cpython-37.pyc
new file mode 100644
index 0000000..3423067
Binary files /dev/null and b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/IdealFilter.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/IdealFilter.cpython-38.pyc b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/IdealFilter.cpython-38.pyc
new file mode 100644
index 0000000..e2db19f
Binary files /dev/null and b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/IdealFilter.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/__init__.cpython-37.pyc b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..bef0ac9
Binary files /dev/null and b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/__init__.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/__init__.cpython-38.pyc b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..75fb32a
Binary files /dev/null and b/数字图像处理平台/function/FrequencyDomainFilter/__pycache__/__init__.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/GeometricTrans/ImageCut.py b/数字图像处理平台/function/GeometricTrans/ImageCut.py
new file mode 100644
index 0000000..1aa46b5
--- /dev/null
+++ b/数字图像处理平台/function/GeometricTrans/ImageCut.py
@@ -0,0 +1,9 @@
+from cv2 import selectROI
+from function.GeometricTrans.LargeSmall import largeSmall
+
+def cut(img,rate):
+
+ # 得到手动裁剪的矩形区域
+ bbox = selectROI(img, False)
+ cut = img[bbox[1]:bbox[1] + bbox[3], bbox[0]:bbox[0] + bbox[2]]
+ return largeSmall(cut, rate)
diff --git a/数字图像处理平台/function/GeometricTrans/LargeSmall.py b/数字图像处理平台/function/GeometricTrans/LargeSmall.py
new file mode 100644
index 0000000..3669a80
--- /dev/null
+++ b/数字图像处理平台/function/GeometricTrans/LargeSmall.py
@@ -0,0 +1,13 @@
+# import cv2
+from cv2 import resize
+
+def largeSmall(img,rate=100):
+
+ rate = rate / 100
+ img_info = img.shape
+ image_height = img_info[0]
+ image_weight = img_info[1]
+ desHeight = int(rate*image_height)
+ desWeight = int(rate*image_weight)
+ img = resize(img,(desWeight,desHeight))
+ return img
diff --git a/数字图像处理平台/function/GeometricTrans/Mirror.py b/数字图像处理平台/function/GeometricTrans/Mirror.py
new file mode 100644
index 0000000..833ae9d
--- /dev/null
+++ b/数字图像处理平台/function/GeometricTrans/Mirror.py
@@ -0,0 +1,15 @@
+import cv2
+import numpy as np
+
+def mirror1(img,rate):
+ print("111")
+ cv2.flip(img, 1, img)
+ return img
+
+def mirror2(img,rate):
+ cv2.flip(img, 0, img)
+ return img
+
+def mirror3(img,rate):
+ cv2.flip(img, -1,img)
+ return img
\ No newline at end of file
diff --git a/数字图像处理平台/function/GeometricTrans/Ratate.py b/数字图像处理平台/function/GeometricTrans/Ratate.py
new file mode 100644
index 0000000..de0b6a7
--- /dev/null
+++ b/数字图像处理平台/function/GeometricTrans/Ratate.py
@@ -0,0 +1,16 @@
+from cv2 import getRotationMatrix2D,warpAffine
+from math import fabs,sin,radians,cos
+
+def ratate(img,degree=0):
+
+ height, width = img.shape[:2]
+ # 旋转后的尺寸
+ heightNew = int(width * fabs(sin(radians(degree))) + height * fabs(cos(radians(degree))))
+ widthNew = int(height * fabs(sin(radians(degree))) + width * fabs(cos(radians(degree))))
+ # 获得仿射变换矩阵
+ matRotation = getRotationMatrix2D((width / 2, height / 2), degree, 1)
+ matRotation[0, 2] += (widthNew - width) / 2
+ matRotation[1, 2] += (heightNew - height) / 2
+ # 进行仿射变换
+ imgRotation = warpAffine(img, matRotation, (widthNew, heightNew), borderValue=(68, 68, 68))
+ return imgRotation
diff --git a/数字图像处理平台/function/GeometricTrans/__init__.py b/数字图像处理平台/function/GeometricTrans/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/数字图像处理平台/function/GeometricTrans/__pycache__/ImageCut.cpython-37.pyc b/数字图像处理平台/function/GeometricTrans/__pycache__/ImageCut.cpython-37.pyc
new file mode 100644
index 0000000..3494e5e
Binary files /dev/null and b/数字图像处理平台/function/GeometricTrans/__pycache__/ImageCut.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/GeometricTrans/__pycache__/ImageCut.cpython-38.pyc b/数字图像处理平台/function/GeometricTrans/__pycache__/ImageCut.cpython-38.pyc
new file mode 100644
index 0000000..2aaec7f
Binary files /dev/null and b/数字图像处理平台/function/GeometricTrans/__pycache__/ImageCut.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/GeometricTrans/__pycache__/LargeSmall.cpython-37.pyc b/数字图像处理平台/function/GeometricTrans/__pycache__/LargeSmall.cpython-37.pyc
new file mode 100644
index 0000000..8feb808
Binary files /dev/null and b/数字图像处理平台/function/GeometricTrans/__pycache__/LargeSmall.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/GeometricTrans/__pycache__/LargeSmall.cpython-38.pyc b/数字图像处理平台/function/GeometricTrans/__pycache__/LargeSmall.cpython-38.pyc
new file mode 100644
index 0000000..67416a2
Binary files /dev/null and b/数字图像处理平台/function/GeometricTrans/__pycache__/LargeSmall.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/GeometricTrans/__pycache__/Mirror.cpython-37.pyc b/数字图像处理平台/function/GeometricTrans/__pycache__/Mirror.cpython-37.pyc
new file mode 100644
index 0000000..a240a88
Binary files /dev/null and b/数字图像处理平台/function/GeometricTrans/__pycache__/Mirror.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/GeometricTrans/__pycache__/Mirror.cpython-38.pyc b/数字图像处理平台/function/GeometricTrans/__pycache__/Mirror.cpython-38.pyc
new file mode 100644
index 0000000..b823951
Binary files /dev/null and b/数字图像处理平台/function/GeometricTrans/__pycache__/Mirror.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/GeometricTrans/__pycache__/Ratate.cpython-37.pyc b/数字图像处理平台/function/GeometricTrans/__pycache__/Ratate.cpython-37.pyc
new file mode 100644
index 0000000..6606238
Binary files /dev/null and b/数字图像处理平台/function/GeometricTrans/__pycache__/Ratate.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/GeometricTrans/__pycache__/Ratate.cpython-38.pyc b/数字图像处理平台/function/GeometricTrans/__pycache__/Ratate.cpython-38.pyc
new file mode 100644
index 0000000..b4d99c7
Binary files /dev/null and b/数字图像处理平台/function/GeometricTrans/__pycache__/Ratate.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/GeometricTrans/__pycache__/__init__.cpython-37.pyc b/数字图像处理平台/function/GeometricTrans/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..aa455ca
Binary files /dev/null and b/数字图像处理平台/function/GeometricTrans/__pycache__/__init__.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/GeometricTrans/__pycache__/__init__.cpython-38.pyc b/数字图像处理平台/function/GeometricTrans/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..9ef599c
Binary files /dev/null and b/数字图像处理平台/function/GeometricTrans/__pycache__/__init__.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/GrayscaleTrans/BGR2GRAY.py b/数字图像处理平台/function/GrayscaleTrans/BGR2GRAY.py
new file mode 100644
index 0000000..80caf62
--- /dev/null
+++ b/数字图像处理平台/function/GrayscaleTrans/BGR2GRAY.py
@@ -0,0 +1,14 @@
+from numpy import uint8
+
+def rgbToGray(img):
+
+ # 得到(r,g,b)三通道
+ b = img[:, :, 0].copy()
+ g = img[:, :, 1].copy()
+ r = img[:, :, 2].copy()
+ # 灰度化
+ out = 0.2126 * r + 0.7152 * g + 0.0722 * b
+ out = out.astype(uint8)
+ return out
+
+
diff --git a/数字图像处理平台/function/GrayscaleTrans/Binarization.py b/数字图像处理平台/function/GrayscaleTrans/Binarization.py
new file mode 100644
index 0000000..d5157ce
--- /dev/null
+++ b/数字图像处理平台/function/GrayscaleTrans/Binarization.py
@@ -0,0 +1,10 @@
+from function.GrayscaleTrans.BGR2GRAY import *
+
+def binarization(img, th=128):
+
+ _, _, colorChannel = img.shape
+ if colorChannel != 1:
+ img = rgbToGray(img)
+ img[img < th] = 0
+ img[img >= th] = 255
+ return img
\ No newline at end of file
diff --git a/数字图像处理平台/function/GrayscaleTrans/GammaTrans.py b/数字图像处理平台/function/GrayscaleTrans/GammaTrans.py
new file mode 100644
index 0000000..a34516b
--- /dev/null
+++ b/数字图像处理平台/function/GrayscaleTrans/GammaTrans.py
@@ -0,0 +1,16 @@
+from math import pow
+from cv2 import normalize,NORM_MINMAX,convertScaleAbs
+from numpy import uint8,zeros,float32
+def gammaTranform(c,gamma,image):
+
+ h,w,d = image.shape[0],image.shape[1],image.shape[2]
+ new_img = zeros((h,w,d),dtype=float32)
+ for i in range(h):
+ for j in range(w):
+ new_img[i,j,0] = c*pow(image[i, j, 0], gamma)
+ new_img[i,j,1] = c*pow(image[i, j, 1], gamma)
+ new_img[i,j,2] = c*pow(image[i, j, 2], gamma)
+ normalize(new_img,new_img,0,255,NORM_MINMAX)
+ new_img = convertScaleAbs(new_img)
+ output_imgae = new_img.astype(uint8)
+ return output_imgae
\ No newline at end of file
diff --git a/数字图像处理平台/function/GrayscaleTrans/Reverse.py b/数字图像处理平台/function/GrayscaleTrans/Reverse.py
new file mode 100644
index 0000000..a511c43
--- /dev/null
+++ b/数字图像处理平台/function/GrayscaleTrans/Reverse.py
@@ -0,0 +1,13 @@
+# import numpy as np
+from numpy import copy,max,uint8
+def image_reverse(input_image):
+
+ input_image_cp = copy(input_image) # 输入图像的副本
+
+ pixels_value_max = max(input_image_cp) # 输入图像像素的最大值
+
+ output_imgae = pixels_value_max - input_image_cp # 输出图像
+
+ output_imgae = output_imgae.astype(uint8)
+
+ return output_imgae
\ No newline at end of file
diff --git a/数字图像处理平台/function/GrayscaleTrans/__init__.py b/数字图像处理平台/function/GrayscaleTrans/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/数字图像处理平台/function/GrayscaleTrans/__pycache__/BGR2GRAY.cpython-37.pyc b/数字图像处理平台/function/GrayscaleTrans/__pycache__/BGR2GRAY.cpython-37.pyc
new file mode 100644
index 0000000..f16016d
Binary files /dev/null and b/数字图像处理平台/function/GrayscaleTrans/__pycache__/BGR2GRAY.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/GrayscaleTrans/__pycache__/BGR2GRAY.cpython-38.pyc b/数字图像处理平台/function/GrayscaleTrans/__pycache__/BGR2GRAY.cpython-38.pyc
new file mode 100644
index 0000000..fe62d00
Binary files /dev/null and b/数字图像处理平台/function/GrayscaleTrans/__pycache__/BGR2GRAY.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/GrayscaleTrans/__pycache__/Binarization.cpython-37.pyc b/数字图像处理平台/function/GrayscaleTrans/__pycache__/Binarization.cpython-37.pyc
new file mode 100644
index 0000000..707ca4e
Binary files /dev/null and b/数字图像处理平台/function/GrayscaleTrans/__pycache__/Binarization.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/GrayscaleTrans/__pycache__/Binarization.cpython-38.pyc b/数字图像处理平台/function/GrayscaleTrans/__pycache__/Binarization.cpython-38.pyc
new file mode 100644
index 0000000..555be83
Binary files /dev/null and b/数字图像处理平台/function/GrayscaleTrans/__pycache__/Binarization.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/GrayscaleTrans/__pycache__/GammaTrans.cpython-37.pyc b/数字图像处理平台/function/GrayscaleTrans/__pycache__/GammaTrans.cpython-37.pyc
new file mode 100644
index 0000000..d7b46b7
Binary files /dev/null and b/数字图像处理平台/function/GrayscaleTrans/__pycache__/GammaTrans.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/GrayscaleTrans/__pycache__/GammaTrans.cpython-38.pyc b/数字图像处理平台/function/GrayscaleTrans/__pycache__/GammaTrans.cpython-38.pyc
new file mode 100644
index 0000000..e199b2f
Binary files /dev/null and b/数字图像处理平台/function/GrayscaleTrans/__pycache__/GammaTrans.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/GrayscaleTrans/__pycache__/Reverse.cpython-37.pyc b/数字图像处理平台/function/GrayscaleTrans/__pycache__/Reverse.cpython-37.pyc
new file mode 100644
index 0000000..8a2d085
Binary files /dev/null and b/数字图像处理平台/function/GrayscaleTrans/__pycache__/Reverse.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/GrayscaleTrans/__pycache__/Reverse.cpython-38.pyc b/数字图像处理平台/function/GrayscaleTrans/__pycache__/Reverse.cpython-38.pyc
new file mode 100644
index 0000000..a3d05d6
Binary files /dev/null and b/数字图像处理平台/function/GrayscaleTrans/__pycache__/Reverse.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/GrayscaleTrans/__pycache__/__init__.cpython-37.pyc b/数字图像处理平台/function/GrayscaleTrans/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..e3cb292
Binary files /dev/null and b/数字图像处理平台/function/GrayscaleTrans/__pycache__/__init__.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/GrayscaleTrans/__pycache__/__init__.cpython-38.pyc b/数字图像处理平台/function/GrayscaleTrans/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..fea044e
Binary files /dev/null and b/数字图像处理平台/function/GrayscaleTrans/__pycache__/__init__.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/HistogramTrans/Equalize.py b/数字图像处理平台/function/HistogramTrans/Equalize.py
new file mode 100644
index 0000000..c646404
--- /dev/null
+++ b/数字图像处理平台/function/HistogramTrans/Equalize.py
@@ -0,0 +1,19 @@
+# import numpy as np
+from numpy import where,uint8
+from cv2 import cvtColor,COLOR_RGBA2BGR
+# histogram equalization
+def hist_equal(img, z_max=255):
+ if img.shape == 4:
+ img = cvtColor(img,COLOR_RGBA2BGR)
+ H, W, C = img.shape
+ S = H * W * C * 1.
+ out = img.copy()
+ sum_h = 0.
+ for i in range(1, 255):
+ ind = where(img == i)
+ sum_h += len(img[ind])
+ z_prime = z_max / S * sum_h
+ out[ind] = z_prime
+ out = out.astype(uint8)
+ return out
+
diff --git a/数字图像处理平台/function/HistogramTrans/HistogramMatch.py b/数字图像处理平台/function/HistogramTrans/HistogramMatch.py
new file mode 100644
index 0000000..96313c6
--- /dev/null
+++ b/数字图像处理平台/function/HistogramTrans/HistogramMatch.py
@@ -0,0 +1,30 @@
+from custom.ImageView import childwindow1
+from cv2 import cvtColor,COLOR_RGBA2RGB,imread
+from numpy import zeros_like,histogram,cumsum
+
+def HisgramMatch(img):
+ _, _, colorChannel = img.shape
+ if colorChannel == 4:# 4维降为3维
+ img = cvtColor(img,COLOR_RGBA2RGB)
+ colorChannel = colorChannel -1
+ childwindow = childwindow1()
+ fname = childwindow.openfile()
+ ref = imread(fname) # 读取匹配的图像
+ _, _, colorChannel1 = ref.shape
+ if colorChannel1 == 4:
+ ref = cvtColor(ref, COLOR_RGBA2RGB)
+ out = zeros_like(img)
+ for i in range(colorChannel):
+ print(i)
+ hist_img, _ = histogram(img[:, :, i], 256) # 得到图像的直方图
+ hist_ref, _ = histogram(ref[:, :, i], 256)
+ cdf_img = cumsum(hist_img) # 得到图像的累计直方图
+ cdf_ref = cumsum(hist_ref)
+
+ for j in range(256):
+ tmp = abs(cdf_img[j] - cdf_ref)
+ tmp = tmp.tolist()
+ idx = tmp.index(min(tmp)) # 得到灰度阶差距最小的下标
+ out[:, :, i][img[:, :, i] == j] = idx
+
+ return out
diff --git a/数字图像处理平台/function/HistogramTrans/__init__.py b/数字图像处理平台/function/HistogramTrans/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/数字图像处理平台/function/HistogramTrans/__pycache__/Equalize.cpython-37.pyc b/数字图像处理平台/function/HistogramTrans/__pycache__/Equalize.cpython-37.pyc
new file mode 100644
index 0000000..a56daa9
Binary files /dev/null and b/数字图像处理平台/function/HistogramTrans/__pycache__/Equalize.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/HistogramTrans/__pycache__/Equalize.cpython-38.pyc b/数字图像处理平台/function/HistogramTrans/__pycache__/Equalize.cpython-38.pyc
new file mode 100644
index 0000000..79dc26f
Binary files /dev/null and b/数字图像处理平台/function/HistogramTrans/__pycache__/Equalize.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/HistogramTrans/__pycache__/HistogramMatch.cpython-37.pyc b/数字图像处理平台/function/HistogramTrans/__pycache__/HistogramMatch.cpython-37.pyc
new file mode 100644
index 0000000..493d2c2
Binary files /dev/null and b/数字图像处理平台/function/HistogramTrans/__pycache__/HistogramMatch.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/HistogramTrans/__pycache__/HistogramMatch.cpython-38.pyc b/数字图像处理平台/function/HistogramTrans/__pycache__/HistogramMatch.cpython-38.pyc
new file mode 100644
index 0000000..f35a34e
Binary files /dev/null and b/数字图像处理平台/function/HistogramTrans/__pycache__/HistogramMatch.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/HistogramTrans/__pycache__/__init__.cpython-37.pyc b/数字图像处理平台/function/HistogramTrans/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..42ac100
Binary files /dev/null and b/数字图像处理平台/function/HistogramTrans/__pycache__/__init__.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/HistogramTrans/__pycache__/__init__.cpython-38.pyc b/数字图像处理平台/function/HistogramTrans/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..ebb382b
Binary files /dev/null and b/数字图像处理平台/function/HistogramTrans/__pycache__/__init__.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/IdCardPicGenerate/IdCardPicGenerate.py b/数字图像处理平台/function/IdCardPicGenerate/IdCardPicGenerate.py
new file mode 100644
index 0000000..e4c3ae6
--- /dev/null
+++ b/数字图像处理平台/function/IdCardPicGenerate/IdCardPicGenerate.py
@@ -0,0 +1,51 @@
+import cv2
+import numpy as np
+import dlib
+from matplotlib import pyplot as plt
+
+def idCardPicGenerate(img, type):
+ detector = dlib.get_frontal_face_detector() # 返回人脸的矩形框
+ # 返回人脸重要的68个点的位置
+ landmark_predictor = dlib.shape_predictor('E:/Digital_Image_Process-master/function/IdCardPicGenerate/shape_predictor_68_face_landmarks.dat')
+ print("11111")
+ if img.shape[2] == 4:
+ img = cv2.cvtColor(img,cv2.COLOR_RGBA2BGR)
+ imgg = img.copy()
+ t = img.shape
+ faces = detector(img, 1)
+ print(faces)
+ mask = np.zeros(img.shape[:2], np.uint8)
+ bgdModel = np.zeros((1, 65), np.float64)
+ fgdModel = np.zeros((1, 65), np.float64)
+ if (len(faces) > 0):
+ for k, d in enumerate(faces):
+ left = max(int((3 * d.left() - d.right()) / 2), 1)
+ top = max(int((3 * d.top() - d.bottom()) / 2) - 50, 1)
+ right = min(int((3 * d.right() - d.left()) / 2), t[1])
+ bottom = min(int((3 * d.bottom() - d.top()) / 2), t[0])
+ rect = (left, top, right, bottom)
+ rect_reg = (d.left(), d.top(), d.right(), d.bottom())
+ # shape = landmark_predictor(img, d)
+ shape = landmark_predictor(img, d)
+ print(shape)
+ else:
+ exit(0)
+ # mask会保存明显的背景像素为0,明显的前景像素为1,可能的背景像素为2,可能的前景像素为3
+ cv2.grabCut(img, mask, rect, bgdModel, fgdModel, 100,
+ cv2.GC_INIT_WITH_RECT) # 函数返回值为mask,bgdModel,fgdModel
+ # 利用mask做模板
+ mask2 = np.where((mask == 2) | (mask == 0), 0, 1).astype('uint8') # 0和2做背景
+
+ # 背景颜色
+ bg_color = [(225, 166, 23), (0, 0, 255), (255, 255, 255)]
+ img = img * mask2[:, :, np.newaxis] # 使用蒙板来获取前景区域
+ erode = cv2.erode(img, None, iterations=1) # 腐蚀操作
+ dilate = cv2.dilate(erode, None, iterations=1) # 膨胀操作
+ for i in range(t[0]): # 高、
+ for j in range(t[1]):
+ if max(dilate[i, j]) <= 0:
+ dilate[i, j] = bg_color[type]
+ img = img[rect[1]:rect[3], rect[0]:rect[2]]
+ dilate = dilate[rect[1]:rect[3], rect[0]:rect[2]]
+ output_im = cv2.resize(dilate, (361, 381))
+ return output_im
\ No newline at end of file
diff --git a/数字图像处理平台/function/IdCardPicGenerate/__init__.py b/数字图像处理平台/function/IdCardPicGenerate/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/数字图像处理平台/function/IdCardPicGenerate/__pycache__/IdCardPicGenerate.cpython-37.pyc b/数字图像处理平台/function/IdCardPicGenerate/__pycache__/IdCardPicGenerate.cpython-37.pyc
new file mode 100644
index 0000000..a64e52c
Binary files /dev/null and b/数字图像处理平台/function/IdCardPicGenerate/__pycache__/IdCardPicGenerate.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/IdCardPicGenerate/__pycache__/IdCardPicGenerate.cpython-38.pyc b/数字图像处理平台/function/IdCardPicGenerate/__pycache__/IdCardPicGenerate.cpython-38.pyc
new file mode 100644
index 0000000..49ce58c
Binary files /dev/null and b/数字图像处理平台/function/IdCardPicGenerate/__pycache__/IdCardPicGenerate.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/IdCardPicGenerate/__pycache__/__init__.cpython-37.pyc b/数字图像处理平台/function/IdCardPicGenerate/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..4144eb1
Binary files /dev/null and b/数字图像处理平台/function/IdCardPicGenerate/__pycache__/__init__.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/IdCardPicGenerate/__pycache__/__init__.cpython-38.pyc b/数字图像处理平台/function/IdCardPicGenerate/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..dab8c8a
Binary files /dev/null and b/数字图像处理平台/function/IdCardPicGenerate/__pycache__/__init__.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/IdCardPicGenerate/shape_predictor_68_face_landmarks.dat b/数字图像处理平台/function/IdCardPicGenerate/shape_predictor_68_face_landmarks.dat
new file mode 100644
index 0000000..e0ec20d
Binary files /dev/null and b/数字图像处理平台/function/IdCardPicGenerate/shape_predictor_68_face_landmarks.dat differ
diff --git a/数字图像处理平台/function/LineChange/AffineTransformation.py b/数字图像处理平台/function/LineChange/AffineTransformation.py
new file mode 100644
index 0000000..f18c650
--- /dev/null
+++ b/数字图像处理平台/function/LineChange/AffineTransformation.py
@@ -0,0 +1,19 @@
+import cv2
+import numpy as np
+
+def Affine(img):
+ # 图像输入
+ src = img
+ # 图像放缩
+ src = cv2.resize(src, (256, 256))
+ # 获取图像shape
+ rows, cols = src.shape[: 2]
+
+ ########Begin########
+ # 设置图像仿射变化矩阵
+ post1 = np.float32([[50, 50], [200, 50], [50, 200]])
+ post2 = np.float32([[10, 100], [200, 50], [100, 250]])
+ M = cv2.getAffineTransform(post1, post2)
+ # 图像仿射变换,及保存
+ result = cv2.warpAffine(src, M, (rows, cols))
+ return result
\ No newline at end of file
diff --git a/数字图像处理平台/function/LineChange/ImgeFix.py b/数字图像处理平台/function/LineChange/ImgeFix.py
new file mode 100644
index 0000000..b4d87fc
--- /dev/null
+++ b/数字图像处理平台/function/LineChange/ImgeFix.py
@@ -0,0 +1,9 @@
+import numpy as np
+import cv2
+def ImgeFix(img):
+ # 图像转换为灰度图像
+ gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
+ # 灰度二值化
+ _, mask = cv2.threshold(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY), 100, 255, cv2.THRESH_BINARY_INV)
+ dst = cv2.inpaint(img, mask, 10, cv2.INPAINT_NS) # 3:领域大小
+ return dst
\ No newline at end of file
diff --git a/数字图像处理平台/function/LineChange/LineCheck.py b/数字图像处理平台/function/LineChange/LineCheck.py
new file mode 100644
index 0000000..195f26f
--- /dev/null
+++ b/数字图像处理平台/function/LineChange/LineCheck.py
@@ -0,0 +1,46 @@
+# -*- coding: utf-8 -*-
+import cv2
+import numpy as np
+
+def LineCheck(img):
+
+ img = cv2.GaussianBlur(img, (3, 3), 0)
+ edges = cv2.Canny(img, 50, 150, apertureSize=3)
+
+
+ lines = cv2.HoughLines(edges,1,np.pi/2,118)
+
+ ######### end ##########
+
+ result = img.copy()
+ for i_line in lines:
+ for line in i_line:
+ rho = line[0]
+ theta = line[1]
+ if (theta < (np.pi / 4.)) or (theta > (3. * np.pi / 4.0)): # 垂直直线
+ pt1 = (int(rho / np.cos(theta)), 0)
+ pt2 = (int((rho - result.shape[0] * np.sin(theta)) / np.cos(theta)), result.shape[0])
+ cv2.line(result, pt1, pt2, (0, 0, 255))
+ else:
+ pt1 = (0, int(rho / np.sin(theta)))
+ pt2 = (result.shape[1], int((rho - result.shape[1] * np.cos(theta)) / np.sin(theta)))
+ cv2.line(result, pt1, pt2, (0, 0, 255), 1)
+
+
+ minLineLength = 200
+ maxLineGap = 15
+ lines=None
+
+
+ linesP=cv2.HoughLinesP(edges,1,np.pi/180,80,minLineLength,maxLineGap)
+
+ ######### end ##########
+
+
+ result_P = img.copy()
+ for i_P in linesP:
+ for x1, y1, x2, y2 in i_P:
+ cv2.line(result_P, (x1, y1), (x2, y2), (0, 255, 0), 3)
+
+
+ return result_P
\ No newline at end of file
diff --git a/数字图像处理平台/function/LineChange/__init__.py b/数字图像处理平台/function/LineChange/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/数字图像处理平台/function/LineChange/__pycache__/AffineTransformation.cpython-37.pyc b/数字图像处理平台/function/LineChange/__pycache__/AffineTransformation.cpython-37.pyc
new file mode 100644
index 0000000..838f458
Binary files /dev/null and b/数字图像处理平台/function/LineChange/__pycache__/AffineTransformation.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/LineChange/__pycache__/ImgeFix.cpython-37.pyc b/数字图像处理平台/function/LineChange/__pycache__/ImgeFix.cpython-37.pyc
new file mode 100644
index 0000000..88ff538
Binary files /dev/null and b/数字图像处理平台/function/LineChange/__pycache__/ImgeFix.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/LineChange/__pycache__/LineCheck.cpython-37.pyc b/数字图像处理平台/function/LineChange/__pycache__/LineCheck.cpython-37.pyc
new file mode 100644
index 0000000..2f2beee
Binary files /dev/null and b/数字图像处理平台/function/LineChange/__pycache__/LineCheck.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/LineChange/__pycache__/__init__.cpython-37.pyc b/数字图像处理平台/function/LineChange/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..c728d0d
Binary files /dev/null and b/数字图像处理平台/function/LineChange/__pycache__/__init__.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/SharpenTrans/Canny.py b/数字图像处理平台/function/SharpenTrans/Canny.py
new file mode 100644
index 0000000..9b27a66
--- /dev/null
+++ b/数字图像处理平台/function/SharpenTrans/Canny.py
@@ -0,0 +1,20 @@
+import cv2
+
+# Canny算子
+def CannyFilter(img):
+ # 读取图像
+ src = img
+
+ ########## Begin ##########
+ # 1. 高斯滤波
+ blur = cv2.GaussianBlur(src, (3, 3), 0)
+ # 2. 灰度转换
+ blur = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
+ # 3. 求x,y方向的Sobel算子
+ gradx = cv2.Sobel(blur, cv2.CV_16SC1, 1, 0)
+ grady = cv2.Sobel(blur, cv2.CV_16SC1, 0, 1)
+ # 4. 使用Canny函数处理图像,x,y分别是3求出来的梯度,低阈值50,高阈值150
+ edge_output = cv2.Canny(gradx, grady, 50, 150)
+ ########## End ##########
+
+ return edge_output
\ No newline at end of file
diff --git a/数字图像处理平台/function/SharpenTrans/Laplacian.py b/数字图像处理平台/function/SharpenTrans/Laplacian.py
new file mode 100644
index 0000000..6ec9169
--- /dev/null
+++ b/数字图像处理平台/function/SharpenTrans/Laplacian.py
@@ -0,0 +1,25 @@
+# import cv2
+# import numpy as np
+
+
+# laplacian filter
+from function.GrayscaleTrans.BGR2GRAY import rgbToGray
+from numpy import zeros,sum,clip,float,uint8
+
+def laplacian_filter(img, K_size=3):
+ H, W, C = img.shape
+ gray = rgbToGray(img)
+ # zero padding
+ pad = K_size // 2
+ out = zeros((H + pad * 2, W + pad * 2), dtype=float)
+ out[pad: pad + H, pad: pad + W] = gray.copy().astype(float)
+ tmp = out.copy()
+ # laplacian kernle
+ K = [[0., 1., 0.],[1., -4., 1.], [0., 1., 0.]]
+ # filtering
+ for y in range(H):
+ for x in range(W):
+ out[pad + y, pad + x] = sum(K * (tmp[y: y + K_size, x: x + K_size]))
+ out = clip(out, 0, 255)
+ out = out[pad: pad + H, pad: pad + W].astype(uint8)
+ return out
\ No newline at end of file
diff --git a/数字图像处理平台/function/SharpenTrans/LoG.py b/数字图像处理平台/function/SharpenTrans/LoG.py
new file mode 100644
index 0000000..43b471c
--- /dev/null
+++ b/数字图像处理平台/function/SharpenTrans/LoG.py
@@ -0,0 +1,29 @@
+import numpy as np
+import cv2
+
+
+def LogFilter(img1):
+ # 读取图像
+ img = img1
+ ########## Begin ##########
+ # 1. 灰度转换
+ grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
+ # 2. 边缘扩充处理图像并使用高斯滤波处理该图像
+ img = cv2.copyMakeBorder(grayImage, 2, 2, 2, 2, borderType=cv2.BORDER_REPLICATE)
+ image = cv2.GaussianBlur(img, (3, 3), 0, 0)
+ # 3. 使用Numpy定义LoG算子
+ m1 = np.array([[0, 0, -1, 0, 0], [0, -1, -2, -1, 0], [-1, -2, 16, -2, -1], [0, -1, -2, -1, 0], [0, 0, -1, 0, 0]])
+ rows = image.shape[0]
+ cols = image.shape[1]
+ # 4. 卷积运算
+ # 为了使卷积对每个像素都进行运算,原图像的边缘像素要对准模板的中心。
+ # 由于图像边缘扩大了2像素,因此要从位置2到行(列)-2
+ image1 = np.zeros(image.shape)
+ for i in range(2, rows - 2):
+ for j in range(2, cols - 2):
+ image1[i, j] = np.sum((m1 * image[i - 2:i + 3, j - 2:j + 3, 1]))
+ # 5. 数据格式转换
+ image1 = cv2.convertScaleAbs(image1)
+ ########## End ##########
+
+ return image1
diff --git a/数字图像处理平台/function/SharpenTrans/Prewitt.py b/数字图像处理平台/function/SharpenTrans/Prewitt.py
new file mode 100644
index 0000000..16b9d6a
--- /dev/null
+++ b/数字图像处理平台/function/SharpenTrans/Prewitt.py
@@ -0,0 +1,40 @@
+# import cv2
+# import numpy as np
+from cv2 import addWeighted
+from numpy import zeros,expand_dims,float,uint8,sum,clip
+from function.GrayscaleTrans.BGR2GRAY import rgbToGray
+
+# prewitt filter
+def prewitt_filter(img, K_size=3):
+ gray = rgbToGray(img)
+ if len(img.shape) == 3:
+ H, W, C = img.shape
+ else:
+ img = expand_dims(img, axis=-1)
+ H, W, C = img.shape
+ # 填充0
+ pad = K_size // 2
+ out = zeros((H + pad * 2, W + pad * 2), dtype=float)
+ out[pad: pad + H, pad: pad + W] = gray.copy().astype(float)
+ tmp = out.copy()
+ out_v = out.copy()
+ out_h = out.copy()
+ ## prewitt 水平方向的核
+ Kv = [[-1., -1., -1.],[0., 0., 0.], [1., 1., 1.]]
+ ## prewitt 竖直方向的核
+ Kh = [[-1., 0., 1.],[-1., 0., 1.],[-1., 0., 1.]]
+ # filtering
+ for y in range(H):
+ for x in range(W):
+ out_v[pad + y, pad + x] = sum(Kv * (tmp[y: y + K_size, x: x + K_size]))
+ out_h[pad + y, pad + x] = sum(Kh * (tmp[y: y + K_size, x: x + K_size]))
+ out_v = clip(out_v, 0, 255)
+ out_h = clip(out_h, 0, 255)
+ out_v = out_v[pad: pad + H, pad: pad + W].astype(uint8)
+ out_h = out_h[pad: pad + H, pad: pad + W].astype(uint8)
+ dst = addWeighted(out_v, 0.5, out_h, 0.5, 0)
+ return dst
+
+# 读取图像
+# img = cv2.imread('../pic/boy.png')
+# prewitt_filter(img)
\ No newline at end of file
diff --git a/数字图像处理平台/function/SharpenTrans/Robert.py b/数字图像处理平台/function/SharpenTrans/Robert.py
new file mode 100644
index 0000000..453fb83
--- /dev/null
+++ b/数字图像处理平台/function/SharpenTrans/Robert.py
@@ -0,0 +1,67 @@
+# import cv2
+# import numpy as np
+# import matplotlib.pyplot as plt
+from cv2 import convertScaleAbs,addWeighted,cvtColor,COLOR_BGR2GRAY,CV_16S,filter2D
+from function.GrayscaleTrans.BGR2GRAY import rgbToGray
+
+
+def robert(img):
+ img1 = rgbToGray(img)
+ img2 = rgbToGray(img)
+ # img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
+ r, c = img1.shape
+ # r_sunnzi = [[-1, -1], [1, 1]]
+ r_sunnzi_x = [[-1, 0], [0, 1]]
+ r_sunnzi_y = [[0, -1], [1, 0]]
+ for x in range(r):
+ for y in range(c):
+ if (y + 2 <= c) and (x + 2 <= r):
+ imgChild = img1[x:x + 2, y:y + 2]
+ list_robert = r_sunnzi_x * imgChild
+ img1[x, y] = abs(list_robert.sum()) # 求和加绝对值
+ for x in range(r):
+ for y in range(c):
+ if (y + 2 <= c) and (x + 2 <= r):
+ imgChild = img2[x:x + 2, y:y + 2]
+ list_robert = r_sunnzi_y * imgChild
+ img2[x, y] = abs(list_robert.sum()) # 求和加绝对值
+ # 转uint8
+ absX = convertScaleAbs(img1)
+ absY = convertScaleAbs(img2)
+ result = addWeighted(absX, 0.5, absY, 0.5, 0)
+ # result = cv2.addWeighted(img1, 0.5, img2, 0.5, 0)
+ # cv2.imshow("result",result)
+ # cv2.waitKey(0)
+ return result
+
+
+def cv2_robert(img):
+ # lenna_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
+
+ # 灰度化处理图像
+ grayImage = cvtColor(img, COLOR_BGR2GRAY)
+
+ # Roberts算子
+ kernelx = np.array([[-1, 0], [0, 1]], dtype=int)
+ kernely = np.array([[0, -1], [1, 0]], dtype=int)
+ x = filter2D(grayImage, CV_16S, kernelx)
+ y = filter2D(grayImage, CV_16S, kernely)
+ # 转uint8
+ absX = convertScaleAbs(x)
+ absY = convertScaleAbs(y)
+ result = addWeighted(absX, 0.5, absY, 0.5, 0)
+ return result
+ #
+ # # 显示图形
+ # titles = [u'原始图像', u'Roberts算子']
+ # images = [lenna_img, Roberts]
+ # for i in range(2):
+ # plt.subplot(1, 2, i + 1), plt.imshow(images[i], 'gray')
+ # plt.title(titles[i])
+ # plt.xticks([]), plt.yticks([])
+ # plt.show()
+
+# 读取图像
+# img = cv2.imread('../pic/boy.png')
+# robert(img)
+# cv2_robert(img)
diff --git a/数字图像处理平台/function/SharpenTrans/SobelFilter.py b/数字图像处理平台/function/SharpenTrans/SobelFilter.py
new file mode 100644
index 0000000..beab238
--- /dev/null
+++ b/数字图像处理平台/function/SharpenTrans/SobelFilter.py
@@ -0,0 +1,45 @@
+# import cv2
+# import numpy as np
+from cv2 import CV_16S,Sobel,convertScaleAbs,addWeighted
+from numpy import expand_dims,zeros,float,sum, clip
+from function.GrayscaleTrans.BGR2GRAY import *
+
+# sobel filter
+def sobel_filter(img, K_size=3):
+ if len(img.shape) == 3:
+ H, W, C = img.shape
+ else:
+ img = expand_dims(img, axis=-1)
+ H, W, C = img.shape
+ # 填充0
+ gray = rgbToGray(img) # 灰度化
+ pad = K_size // 2
+ out = zeros((H + pad * 2, W + pad * 2), dtype=float)
+ out[pad: pad + H, pad: pad + W] = gray.copy().astype(float)
+ tmp = out.copy()
+ out_v = out.copy()
+ out_h = out.copy()
+ ## 水平x方向
+ Kx = [[1., 0., -1.], [2., 0., -2.], [1., 0., -1.]]
+ ## 竖直y方向
+ Ky = [[1., 2., 1.],[0., 0., 0.], [-1., -2., -1.]]
+ for y in range(H):
+ for x in range(W):
+ out_v[pad + y, pad + x] = sum(Ky * (tmp[y: y + K_size, x: x + K_size]))
+ out_h[pad + y, pad + x] = sum(Kx * (tmp[y: y + K_size, x: x + K_size]))
+ out_v = clip(out_v, 0, 255)
+ out_h = clip(out_h, 0, 255)
+ out_v = out_v[pad: pad + H, pad: pad + W].astype(uint8)
+ out_h = out_h[pad: pad + H, pad: pad + W].astype(uint8)
+ dst = addWeighted(out_v, 0.5, out_h, 0.5, 0) # 合并两个方向得到的结果
+ return dst
+
+def cv2_sobel(img):
+
+ x = Sobel(img, CV_16S, 1, 0)
+ y = Sobel(img, CV_16S, 0, 1)
+
+ absX = convertScaleAbs(x) # 转回unit8
+ absY = convertScaleAbs(y)
+
+ dst = addWeighted(absX, 0.5, absY, 0.5, 0)
diff --git a/数字图像处理平台/function/SharpenTrans/__init__.py b/数字图像处理平台/function/SharpenTrans/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/数字图像处理平台/function/SharpenTrans/__pycache__/Canny.cpython-37.pyc b/数字图像处理平台/function/SharpenTrans/__pycache__/Canny.cpython-37.pyc
new file mode 100644
index 0000000..52370bd
Binary files /dev/null and b/数字图像处理平台/function/SharpenTrans/__pycache__/Canny.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/SharpenTrans/__pycache__/Laplacian.cpython-37.pyc b/数字图像处理平台/function/SharpenTrans/__pycache__/Laplacian.cpython-37.pyc
new file mode 100644
index 0000000..1880614
Binary files /dev/null and b/数字图像处理平台/function/SharpenTrans/__pycache__/Laplacian.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/SharpenTrans/__pycache__/Laplacian.cpython-38.pyc b/数字图像处理平台/function/SharpenTrans/__pycache__/Laplacian.cpython-38.pyc
new file mode 100644
index 0000000..e48f637
Binary files /dev/null and b/数字图像处理平台/function/SharpenTrans/__pycache__/Laplacian.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/SharpenTrans/__pycache__/LoG.cpython-37.pyc b/数字图像处理平台/function/SharpenTrans/__pycache__/LoG.cpython-37.pyc
new file mode 100644
index 0000000..69bd59a
Binary files /dev/null and b/数字图像处理平台/function/SharpenTrans/__pycache__/LoG.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/SharpenTrans/__pycache__/Prewitt.cpython-37.pyc b/数字图像处理平台/function/SharpenTrans/__pycache__/Prewitt.cpython-37.pyc
new file mode 100644
index 0000000..0868f6c
Binary files /dev/null and b/数字图像处理平台/function/SharpenTrans/__pycache__/Prewitt.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/SharpenTrans/__pycache__/Prewitt.cpython-38.pyc b/数字图像处理平台/function/SharpenTrans/__pycache__/Prewitt.cpython-38.pyc
new file mode 100644
index 0000000..694f86d
Binary files /dev/null and b/数字图像处理平台/function/SharpenTrans/__pycache__/Prewitt.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/SharpenTrans/__pycache__/Robert.cpython-37.pyc b/数字图像处理平台/function/SharpenTrans/__pycache__/Robert.cpython-37.pyc
new file mode 100644
index 0000000..fc999e6
Binary files /dev/null and b/数字图像处理平台/function/SharpenTrans/__pycache__/Robert.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/SharpenTrans/__pycache__/Robert.cpython-38.pyc b/数字图像处理平台/function/SharpenTrans/__pycache__/Robert.cpython-38.pyc
new file mode 100644
index 0000000..f27e547
Binary files /dev/null and b/数字图像处理平台/function/SharpenTrans/__pycache__/Robert.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/SharpenTrans/__pycache__/SobelFilter.cpython-37.pyc b/数字图像处理平台/function/SharpenTrans/__pycache__/SobelFilter.cpython-37.pyc
new file mode 100644
index 0000000..1459ebb
Binary files /dev/null and b/数字图像处理平台/function/SharpenTrans/__pycache__/SobelFilter.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/SharpenTrans/__pycache__/SobelFilter.cpython-38.pyc b/数字图像处理平台/function/SharpenTrans/__pycache__/SobelFilter.cpython-38.pyc
new file mode 100644
index 0000000..ee65eb0
Binary files /dev/null and b/数字图像处理平台/function/SharpenTrans/__pycache__/SobelFilter.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/SharpenTrans/__pycache__/__init__.cpython-37.pyc b/数字图像处理平台/function/SharpenTrans/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..ba87045
Binary files /dev/null and b/数字图像处理平台/function/SharpenTrans/__pycache__/__init__.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/SharpenTrans/__pycache__/__init__.cpython-38.pyc b/数字图像处理平台/function/SharpenTrans/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..a74a077
Binary files /dev/null and b/数字图像处理平台/function/SharpenTrans/__pycache__/__init__.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/SmoothingTrans/GaussianFilter.py b/数字图像处理平台/function/SmoothingTrans/GaussianFilter.py
new file mode 100644
index 0000000..2dbd27b
--- /dev/null
+++ b/数字图像处理平台/function/SmoothingTrans/GaussianFilter.py
@@ -0,0 +1,30 @@
+import numpy as np
+import math
+import cv2
+# 计算高斯卷积核
+def gausskernel(size,sigma=1.0):
+ gausskernel=np.zeros((size,size),np.float32)
+ for i in range (size):
+ for j in range (size):
+ norm=math.pow(i-1,2)+pow(j-1,2)
+ gausskernel[i,j]=math.exp(-norm/(2*math.pow(sigma,2))) # 求高斯卷积
+ sum=np.sum(gausskernel) # 求和
+ kernel=gausskernel/sum # 归一化
+ return kernel
+
+# 高斯滤波
+def gaussian_filter(img,size=3,sigma=1.3):
+ if img.shape[2] == 4:
+ img = cv2.cvtColor(img,cv2.COLOR_RGBA2GRAY)
+ h=img.shape[0]
+ w=img.shape[1]
+ img1=np.zeros((h,w),np.uint8)
+ kernel=gausskernel(size,sigma) # 计算高斯卷积核
+ for i in range (1,h-1):
+ for j in range (1,w-1):
+ sum=0
+ for k in range(-1,2):
+ for l in range(-1,2):
+ sum+=img[i+k,j+l]*kernel[k+1,l+1] # 高斯滤波
+ img1[i,j]=sum
+ return img1
\ No newline at end of file
diff --git a/数字图像处理平台/function/SmoothingTrans/MeanFilter.py b/数字图像处理平台/function/SmoothingTrans/MeanFilter.py
new file mode 100644
index 0000000..4bd9bee
--- /dev/null
+++ b/数字图像处理平台/function/SmoothingTrans/MeanFilter.py
@@ -0,0 +1,23 @@
+import cv2
+# import numpy as np
+from numpy import zeros,mean,uint8,float
+
+def mean_filter(img, K_size=3):
+ if img.shape[2] == 4:
+ img = cv2.cvtColor(img,cv2.COLOR_RGBA2BGR)
+ H, W, C = img.shape
+ # 填充0
+ pad = K_size // 2
+ out = zeros((H + pad * 2, W + pad * 2, C), dtype=float)
+ out[pad: pad + H, pad: pad + W] = img.copy().astype(float)
+ tmp = out.copy()
+
+ # 算术均值滤波
+ for y in range(H):
+ for x in range(W):
+ for c in range(C):
+ out[pad + y, pad + x, c] = mean(tmp[y: y + K_size, x: x + K_size, c])
+
+ out = out[pad: pad + H, pad: pad + W].astype(uint8)
+
+ return out
\ No newline at end of file
diff --git a/数字图像处理平台/function/SmoothingTrans/MedianFilter.py b/数字图像处理平台/function/SmoothingTrans/MedianFilter.py
new file mode 100644
index 0000000..923a033
--- /dev/null
+++ b/数字图像处理平台/function/SmoothingTrans/MedianFilter.py
@@ -0,0 +1,23 @@
+import cv2
+from numpy import zeros,median,uint8,float
+
+def median_filter(img, K_size=3):
+ H, W, C = img.shape
+ if img.shape[2] == 4:
+ img = cv2.cvtColor(img,cv2.COLOR_RGBA2BGR)
+ # 填充0
+ pad = K_size // 2
+ out = zeros((H + pad*2, W + pad*2, C), dtype=float)
+ out[pad:pad+H, pad:pad+W] = img.copy().astype(float)
+
+ tmp = out.copy()
+
+ # filtering
+ for y in range(H):
+ for x in range(W):
+ for c in range(C):
+ out[pad+y, pad+x, c] = median(tmp[y:y+K_size, x:x+K_size, c])
+
+ out = out[pad:pad+H, pad:pad+W].astype(uint8)
+
+ return out
\ No newline at end of file
diff --git a/数字图像处理平台/function/SmoothingTrans/__init__.py b/数字图像处理平台/function/SmoothingTrans/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/数字图像处理平台/function/SmoothingTrans/__pycache__/GaussianFilter.cpython-37.pyc b/数字图像处理平台/function/SmoothingTrans/__pycache__/GaussianFilter.cpython-37.pyc
new file mode 100644
index 0000000..f7ec27a
Binary files /dev/null and b/数字图像处理平台/function/SmoothingTrans/__pycache__/GaussianFilter.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/SmoothingTrans/__pycache__/GaussianFilter.cpython-38.pyc b/数字图像处理平台/function/SmoothingTrans/__pycache__/GaussianFilter.cpython-38.pyc
new file mode 100644
index 0000000..aa47fe4
Binary files /dev/null and b/数字图像处理平台/function/SmoothingTrans/__pycache__/GaussianFilter.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/SmoothingTrans/__pycache__/MeanFilter.cpython-37.pyc b/数字图像处理平台/function/SmoothingTrans/__pycache__/MeanFilter.cpython-37.pyc
new file mode 100644
index 0000000..f276a03
Binary files /dev/null and b/数字图像处理平台/function/SmoothingTrans/__pycache__/MeanFilter.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/SmoothingTrans/__pycache__/MeanFilter.cpython-38.pyc b/数字图像处理平台/function/SmoothingTrans/__pycache__/MeanFilter.cpython-38.pyc
new file mode 100644
index 0000000..bba5c95
Binary files /dev/null and b/数字图像处理平台/function/SmoothingTrans/__pycache__/MeanFilter.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/SmoothingTrans/__pycache__/MedianFilter.cpython-37.pyc b/数字图像处理平台/function/SmoothingTrans/__pycache__/MedianFilter.cpython-37.pyc
new file mode 100644
index 0000000..f3446fa
Binary files /dev/null and b/数字图像处理平台/function/SmoothingTrans/__pycache__/MedianFilter.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/SmoothingTrans/__pycache__/MedianFilter.cpython-38.pyc b/数字图像处理平台/function/SmoothingTrans/__pycache__/MedianFilter.cpython-38.pyc
new file mode 100644
index 0000000..7cf47f1
Binary files /dev/null and b/数字图像处理平台/function/SmoothingTrans/__pycache__/MedianFilter.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/SmoothingTrans/__pycache__/__init__.cpython-37.pyc b/数字图像处理平台/function/SmoothingTrans/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..738d1cc
Binary files /dev/null and b/数字图像处理平台/function/SmoothingTrans/__pycache__/__init__.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/SmoothingTrans/__pycache__/__init__.cpython-38.pyc b/数字图像处理平台/function/SmoothingTrans/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..88a5dcd
Binary files /dev/null and b/数字图像处理平台/function/SmoothingTrans/__pycache__/__init__.cpython-38.pyc differ
diff --git a/数字图像处理平台/function/__init__.py b/数字图像处理平台/function/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/数字图像处理平台/function/__pycache__/__init__.cpython-37.pyc b/数字图像处理平台/function/__pycache__/__init__.cpython-37.pyc
new file mode 100644
index 0000000..d0f5b90
Binary files /dev/null and b/数字图像处理平台/function/__pycache__/__init__.cpython-37.pyc differ
diff --git a/数字图像处理平台/function/__pycache__/__init__.cpython-38.pyc b/数字图像处理平台/function/__pycache__/__init__.cpython-38.pyc
new file mode 100644
index 0000000..a5e085b
Binary files /dev/null and b/数字图像处理平台/function/__pycache__/__init__.cpython-38.pyc differ
diff --git a/数字图像处理平台/histogram.png b/数字图像处理平台/histogram.png
new file mode 100644
index 0000000..525228b
Binary files /dev/null and b/数字图像处理平台/histogram.png differ
diff --git a/数字图像处理平台/icons/branch-close.png b/数字图像处理平台/icons/branch-close.png
new file mode 100644
index 0000000..1a54719
Binary files /dev/null and b/数字图像处理平台/icons/branch-close.png differ
diff --git a/数字图像处理平台/icons/branch-open.png b/数字图像处理平台/icons/branch-open.png
new file mode 100644
index 0000000..5b733fd
Binary files /dev/null and b/数字图像处理平台/icons/branch-open.png differ
diff --git a/数字图像处理平台/icons/color.png b/数字图像处理平台/icons/color.png
new file mode 100644
index 0000000..e6be09f
Binary files /dev/null and b/数字图像处理平台/icons/color.png differ
diff --git a/数字图像处理平台/icons/main.png b/数字图像处理平台/icons/main.png
new file mode 100644
index 0000000..c0dbddd
Binary files /dev/null and b/数字图像处理平台/icons/main.png differ
diff --git a/数字图像处理平台/icons/右旋转.png b/数字图像处理平台/icons/右旋转.png
new file mode 100644
index 0000000..e845a3e
Binary files /dev/null and b/数字图像处理平台/icons/右旋转.png differ
diff --git a/数字图像处理平台/icons/左旋转.png b/数字图像处理平台/icons/左旋转.png
new file mode 100644
index 0000000..4cac983
Binary files /dev/null and b/数字图像处理平台/icons/左旋转.png differ
diff --git a/数字图像处理平台/icons/直方图.png b/数字图像处理平台/icons/直方图.png
new file mode 100644
index 0000000..81e507d
Binary files /dev/null and b/数字图像处理平台/icons/直方图.png differ
diff --git a/数字图像处理平台/main.py b/数字图像处理平台/main.py
new file mode 100644
index 0000000..c6e2b70
--- /dev/null
+++ b/数字图像处理平台/main.py
@@ -0,0 +1,138 @@
+import sys
+from cv2 import cvtColor,calcHist,imread,COLOR_GRAY2BGR
+import matplotlib.pyplot as plt
+from PyQt5.QtCore import Qt
+from PyQt5.QtGui import QIcon
+from PyQt5.QtWidgets import QAction, QMainWindow, QApplication, QDockWidget, QLabel
+
+from custom.stackedWidget import StackedWidget
+from custom.treeView import FileSystemTreeView
+from custom.listWidgets import FuncListWidget, UsedListWidget
+from custom.graphicsView import GraphicsView
+from function.GeometricTrans.Ratate import ratate
+
+
+class MyApp(QMainWindow):
+ def __init__(self):
+ super(MyApp, self).__init__()
+ QApplication.processEvents()
+ self.childArea = childWindow()
+ self.tool_bar = self.addToolBar('工具栏')
+ self.action_right_rotate = QAction(QIcon("icons/右旋转.png"), "向右旋转90", self)
+ self.action_left_rotate = QAction(QIcon("icons/左旋转.png"), "向左旋转90°", self)
+ self.action_histogram = QAction(QIcon("icons/直方图.png"), "直方图", self)
+ self.action_right_rotate.triggered.connect(self.right_rotate)
+ self.action_left_rotate.triggered.connect(self.left_rotate)
+ self.action_histogram.triggered.connect(self.histogram)
+ # 将上述动作关联到某一个菜单项里面
+ self.tool_bar.addActions((self.action_left_rotate, self.action_right_rotate, self.action_histogram))
+
+ self.useListWidget = UsedListWidget(self)
+ self.funcListWidget = FuncListWidget(self)
+ self.stackedWidget = StackedWidget(self)
+ self.fileSystemTreeView = FileSystemTreeView(self)
+ self.graphicsView = GraphicsView(self)
+
+ self.dock_file = QDockWidget(self)
+ self.dock_file.setWidget(self.fileSystemTreeView)
+ self.dock_file.setTitleBarWidget(QLabel('目录'))
+ self.dock_file.setFeatures(QDockWidget.NoDockWidgetFeatures)
+
+ self.dock_func = QDockWidget(self)
+ self.dock_func.setWidget(self.funcListWidget)
+ self.dock_func.setTitleBarWidget(QLabel('图像操作'))
+ self.dock_func.setFeatures(QDockWidget.NoDockWidgetFeatures)
+
+ self.dock_used = QDockWidget(self)
+ self.dock_used.setWidget(self.useListWidget)
+ self.dock_used.setTitleBarWidget(QLabel('已选操作'))
+ self.dock_used.setFeatures(QDockWidget.NoDockWidgetFeatures)
+ self.dock_used.setFeatures(QDockWidget.NoDockWidgetFeatures)
+
+ self.dock_attr = QDockWidget(self)
+ self.dock_attr.setWidget(self.stackedWidget)
+ self.dock_attr.setTitleBarWidget(QLabel('属性'))
+ self.dock_attr.setFeatures(QDockWidget.NoDockWidgetFeatures)
+ self.dock_attr.close()
+
+ self.setCentralWidget(self.graphicsView)
+ self.addDockWidget(Qt.LeftDockWidgetArea, self.dock_file)
+ self.dock_file.setMinimumWidth(400)
+ self.dock_file.showMinimized()
+ self.addDockWidget(Qt.TopDockWidgetArea, self.dock_func)
+ self.addDockWidget(Qt.RightDockWidgetArea, self.dock_used)
+ self.dock_used.setMinimumWidth(400)
+ self.dock_used.showMinimized()
+ self.addDockWidget(Qt.RightDockWidgetArea, self.dock_attr)
+ self.dock_attr.setMinimumHeight(500)
+
+ self.setWindowTitle('数字图像处理')
+ self.setWindowIcon(QIcon('icons/main.png'))
+ self.src_img = None
+ self.cur_img = None
+
+ def update_image(self):
+ if self.src_img is None:
+ return
+ img = self.process_image()
+ self.cur_img = img
+ self.graphicsView.update_image(img)
+
+ def change_image(self, img):
+ self.src_img = img
+ img = self.process_image()
+ self.cur_img = img
+ self.graphicsView.change_image(img)
+
+ def process_image(self):
+ img = self.src_img.copy()
+ for i in range(self.useListWidget.count()):
+ img = self.useListWidget.item(i)(img)
+ return img
+
+ def right_rotate(self):
+ self.cur_img = ratate(self.cur_img,90)
+ self.graphicsView.rotate(90)
+
+ def left_rotate(self):
+ self.cur_img = ratate(self.cur_img, -90)
+ self.graphicsView.rotate(-90)
+
+ def histogram(self):
+ color = ('b', 'g', 'r')
+ img = self.cur_img
+ shape = img.shape
+ if len(shape) != 3:
+ img = cvtColor(self.cur_img,COLOR_GRAY2BGR)
+ for i, col in enumerate(color):
+ histr = calcHist([img], [i], None, [256], [0, 256])
+ histr = histr.flatten()
+ plt.plot(range(256), histr, color=col)
+ plt.xlim([0, 256])
+ plt.savefig('histogram.png')
+ plt.close()
+ self.img = imread('./histogram.png')
+ self.childArea.display(self.img)
+ self.childArea.show()
+
+
+class childWindow(QMainWindow):
+ def __init__(self,parent=None):
+ super(childWindow, self).__init__(parent)
+ self.setWindowTitle('图像的直方图')
+ self.graphicsView1 = GraphicsView(self)
+ self.setCentralWidget(self.graphicsView1)
+ def display(self,img):
+ self.graphicsView1.change_image(img)
+
+
+
+
+
+
+if __name__ == "__main__":
+ app = QApplication(sys.argv)
+ app.setStyleSheet(open('styleSheet.qss', encoding='utf-8').read())
+ window = MyApp()
+ window.show()
+ sys.exit(app.exec_())
diff --git a/数字图像处理平台/styleSheet.qss b/数字图像处理平台/styleSheet.qss
new file mode 100644
index 0000000..a244671
--- /dev/null
+++ b/数字图像处理平台/styleSheet.qss
@@ -0,0 +1,86 @@
+*{
+ font-family: 微软雅黑;
+ color: #BBBBBB;
+ background-color: #2F2F2F;
+}
+
+/* 设置目录树样式 */
+QTreeView{
+ show-decoration-selected: 1;
+}
+QTreeView::item{
+ height: 30px;
+}
+QTreeView::item:hover, QTreeView::branch:hover{
+ background: #4B6EAF;
+}
+QTreeView::item:selected, QTreeView::branch:selected{
+ background: #4B6EAF;
+}
+QTreeView::branch{
+ color: #BBBBBB;
+}
+QTreeView::branch:has-children:!has-siblings:closed,
+QTreeView::branch:closed:has-children:has-siblings {
+ border-image: none;
+ image: url(icons/branch-close.png);
+}
+QTreeView::branch:open:has-children:!has-siblings,
+QTreeView::branch:open:has-children:has-siblings {
+ border-image: none;
+ image: url(icons/branch-open.png);
+}
+
+/* 设置标签样式 */
+QLabel{
+ font-size: 18px;
+ border: 1px solid #BBBBBB;
+ border-width: 1px 1px 0px 1px;
+}
+
+/* 设置视图样式 */
+QGraphicsView{
+ border: 1px solid #BBBBBB;
+ background-color: #444444;
+}
+
+/* 设置列表样式 */
+QListWidget::Item{
+ border: 1px solid #BBBBBB;
+ font-size: 20px;
+ background: #717678;
+ color: #DDDDDD;
+}
+
+QListWidget::Item:hover{
+ background: #4B6EAF;
+}
+
+FuncListWidget::Item{
+ border-style: inset;
+ border-radius: 8px;
+ border: 1px solid #999999;
+ margin:0px 1px 0px 0px
+}
+
+UsedListWidget::Item{
+ border: 2px solid #999999;
+ margin:0px 0px 1px 0px
+}
+
+UsedListWidget::Item:selected{
+ background: #99CCFF;
+}
+
+
+/* 设置表格样式 */
+QTableWidget{
+ alternate-background-color: #444444;
+}
+
+
+QToolButton:hover{
+ background: #4B6EAF;
+}
+
+