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; +} + +