diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ea549ea
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,84 @@
+### JetBrains template
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
+
+# User-specific stuff
+.idea/**/workspace.xml
+.idea/**/tasks.xml
+.idea/**/usage.statistics.xml
+.idea/**/dictionaries
+.idea/**/shelf
+
+# AWS User-specific
+.idea/**/aws.xml
+
+# Generated files
+.idea/**/contentModel.xml
+
+# Sensitive or high-churn files
+.idea/**/dataSources/
+.idea/**/dataSources.ids
+.idea/**/dataSources.local.xml
+.idea/**/sqlDataSources.xml
+.idea/**/dynamic.xml
+.idea/**/uiDesigner.xml
+.idea/**/dbnavigator.xml
+
+# Gradle
+.idea/**/gradle.xml
+.idea/**/libraries
+
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn. Uncomment if using
+# auto-import.
+# .idea/artifacts
+# .idea/compiler.xml
+# .idea/jarRepositories.xml
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
+# *.iml
+# *.ipr
+
+# CMake
+cmake-build-*/
+
+# Mongo Explorer plugin
+.idea/**/mongoSettings.xml
+
+# File-based project format
+*.iws
+
+# IntelliJ
+out/
+
+# mpeltonen/sbt-idea plugin
+.idea_modules/
+
+# JIRA plugin
+atlassian-ide-plugin.xml
+
+# Cursive Clojure plugin
+.idea/replstate.xml
+
+# SonarLint plugin
+.idea/sonarlint/
+
+# Crashlytics plugin (for Android Studio and IntelliJ)
+com_crashlytics_export_strings.xml
+crashlytics.properties
+crashlytics-build.properties
+fabric.properties
+
+# Editor-based Rest Client
+.idea/httpRequests
+
+# Android studio 3.1+ serialized cache file
+.idea/caches/build_file_checksums.ser
+
+!/20240529RGBtest3/data/
+!/20240529RGBtest3/data/
+!/20240410RGBtest1/super-tomato/defect_big.bmp
+!/20240410RGBtest1/super-tomato/defect_mask.bmp
+!/20240410RGBtest1/defect_big.bmp
diff --git a/.idea/.name b/.idea/.name
new file mode 100644
index 0000000..721f4b2
--- /dev/null
+++ b/.idea/.name
@@ -0,0 +1 @@
+04average.ipynb
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 2c0499a..f6889bb 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -1,4 +1,7 @@
+
+
+
\ No newline at end of file
diff --git a/.idea/other.xml b/.idea/other.xml
new file mode 100644
index 0000000..2e75c2e
--- /dev/null
+++ b/.idea/other.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/supermachine--tomato-passion_fruit.iml b/.idea/supermachine--tomato-passion_fruit.iml
index d0876a7..2368678 100644
--- a/.idea/supermachine--tomato-passion_fruit.iml
+++ b/.idea/supermachine--tomato-passion_fruit.iml
@@ -1,7 +1,9 @@
-
+
+
+
diff --git a/20240410RGBtest1/image_preprocessing.py b/20240410RGBtest1/image_preprocessing.py
index edfd7b4..a246029 100644
--- a/20240410RGBtest1/image_preprocessing.py
+++ b/20240410RGBtest1/image_preprocessing.py
@@ -214,7 +214,7 @@ def extract_max_connected_area(image, lower_hsv, upper_hsv):
def main():
parser = argparse.ArgumentParser(description='Process some integers.')
- parser.add_argument('--dir_path', type=str, default=r'D:\project\Tomato\20240410RGBtest2\datatest',
+ parser.add_argument('--dir_path', type=str, default=r'D:\project\supermachine--tomato-passion_fruit\20240419RGBtest2\data',
help='the directory path of images')
parser.add_argument('--threshold_s_l', type=int, default=180,
help='the threshold for s_l')
@@ -224,7 +224,7 @@ def main():
args = parser.parse_args()
for img_file in os.listdir(args.dir_path):
- if img_file.endswith('.png'):
+ if img_file.endswith('.bmp'):
img_path = os.path.join(args.dir_path, img_file)
s_l = extract_s_l(img_path)
otsu_thresholded = otsu_threshold(s_l)
diff --git a/20240410RGBtest1/super-tomato/image_preprocessing.py b/20240410RGBtest1/super-tomato/image_preprocessing.py
index 11cd38d..b39a5cb 100644
--- a/20240410RGBtest1/super-tomato/image_preprocessing.py
+++ b/20240410RGBtest1/super-tomato/image_preprocessing.py
@@ -211,7 +211,7 @@ def extract_max_connected_area(image_path, lower_hsv, upper_hsv):
def main():
parser = argparse.ArgumentParser(description='Process some integers.')
- parser.add_argument('--dir_path', type=str, default=r'D:\project\Tomato\20240410RGBtest2\data',
+ parser.add_argument('--dir_path', type=str, default=r'D:\project\supermachine--tomato-passion_fruit\20240419RGBtest2\data',
help='the directory path of images')
parser.add_argument('--threshold_s_l', type=int, default=180,
help='the threshold for s_l')
diff --git a/20240410RGBtest1/通信协议(旻哥暂时同意版).md b/20240410RGBtest1/通信协议(旻哥暂时同意版).md
index af31774..6e6147f 100644
--- a/20240410RGBtest1/通信协议(旻哥暂时同意版).md
+++ b/20240410RGBtest1/通信协议(旻哥暂时同意版).md
@@ -20,7 +20,10 @@ ASCII字符,比如`类型1`为' '(空格),`类型2`为' '(空格),`类型3
- **RGB图像数据包' (空格)''(空格) ''I''M'**,`数据1`~`数据i`包含了图像的行数rows(高度)、列数cols(宽度)、以及图像的RGB数据
- $i-4=rows \times cols \times 3$具体如下:
+ $$
+ i-4=rows \times cols \times 3
+ $$
+ 具体如下:
| 行数1 | 行数2 | 列数1 | 列数2 | 图像数据1 | ... | 图像数据(i-4) |
| :--------: | :-------: | :--------: | :-------: | :-------: | :--: | :-----------: |
@@ -28,7 +31,11 @@ ASCII字符,比如`类型1`为' '(空格),`类型2`为' '(空格),`类型3
**返回结果数据包' (空格)''R''I''M'**,`数据1`~`数据i`包含了长径long、短径short、缺陷个数num、缺陷面积area、结果图像的行数rows(高度)、列数cols(宽度)、以及结果图像的RGB数据
- $i-14=rows \times cols \times 3$具体如下:
+
+$$
+i-14=rows \times cols \times 3
+$$
+具体如下:
| 长径1 | 长径2 | 短径1 | 短径2 | 缺陷个数1 | 缺陷个数2 | 缺陷面积1 | 缺陷面积2 | 缺陷面积3 | 缺陷面积4 | 行数1 | 行数2 | 列数1 | 列数2 | 图像数据1 | 图像数据(i-14) |
| :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: | :-: |
@@ -36,7 +43,10 @@ ASCII字符,比如`类型1`为' '(空格),`类型2`为' '(空格),`类型3
- **光谱数据包' (空格)''(空格) ''S''P'**,`数据1`~`数据i`包含了光谱数据的行数rows(高度)、列数cols(宽度)、谱段数bands、以及图像的光谱数据
- $i-6=rows \times cols \times bands \times 4$具体如下:
+ $$
+ i-6=rows \times cols \times bands \times 4
+ $$
+ 具体如下:
| 行数1 | 行数2 | 列数1 | 列数2 | 谱段1 | 谱段2 | 图像数据1 | ... | 图像数据(i-6) |
| :--------: | :-------: | :--------: | :-------: | :---------: | :--------: | :-------: | :--: | :-----------: |
diff --git a/20240529RGBtest3/classifer.py b/20240529RGBtest3/classifer.py
new file mode 100644
index 0000000..ad2492a
--- /dev/null
+++ b/20240529RGBtest3/classifer.py
@@ -0,0 +1,224 @@
+# -*- coding: utf-8 -*-
+# @Time : 2024/6/4 21:34
+# @Author : GG
+# @File : classifer.py
+# @Software: PyCharm
+
+
+import cv2
+import numpy as np
+
+class Tomato:
+ def __init__(self):
+ ''' 初始化 Tomato 类。'''
+ pass
+
+ def extract_s_l(self, image):
+ '''
+ 提取图像的 S 通道(饱和度)和 L 通道(亮度),并将两者相加。
+ :param image: 输入的 BGR 图像
+ :return: S 通道和 L 通道相加的结果
+ '''
+ hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
+ lab = cv2.cvtColor(image, cv2.COLOR_BGR2Lab)
+ s_channel = hsv[:, :, 1]
+ l_channel = lab[:, :, 0]
+ result = cv2.add(s_channel, l_channel)
+ return result
+
+ def find_reflection(self, image, threshold=190):
+ '''
+ 通过阈值处理识别图像中的反射区域。
+ :param image: 输入的单通道图像
+ :param threshold: 用于二值化的阈值
+ :return: 二值化后的图像,高于阈值的部分为白色,其余为黑色
+ '''
+ _, reflection = cv2.threshold(image, threshold, 255, cv2.THRESH_BINARY)
+ return reflection
+
+ def otsu_threshold(self, image):
+ '''
+ 使用 Otsu 大津法自动计算并应用阈值,进行图像的二值化处理。
+ :param image: 输入的单通道图像
+ :return: 二值化后的图像
+ '''
+ _, binary = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
+ return binary
+
+ def extract_g_r(self, image):
+ '''
+ 提取图像中的 G 通道(绿色),放大并减去 R 通道(红色)。
+ :param image: 输入的 BGR 图像
+ :return: G 通道乘以 1.5 后减去 R 通道的结果
+ '''
+ g_channel = image[:, :, 1]
+ r_channel = image[:, :, 2]
+ result = cv2.subtract(cv2.multiply(g_channel, 1.5), r_channel)
+ return result
+
+ def extract_r_b(self, image):
+ '''
+ 提取图像中的 R 通道(红色)和 B 通道(蓝色),并进行相减。
+ :param image: 输入的 BGR 图像
+ :return: R 通道减去 B 通道的结果
+ '''
+ r_channel = image[:, :, 2]
+ b_channel = image[:, :, 0]
+ result = cv2.subtract(r_channel, b_channel)
+ return result
+
+ def extract_r_g(self, image):
+ '''
+ 提取图像中的 R 通道(红色)和 G 通道(绿色),并进行相减。
+ :param image: 输入的 BGR 图像
+ :return: R 通道减去 G 通道的结果
+ '''
+ r_channel = image[:, :, 2]
+ g_channel = image[:, :, 1]
+ result = cv2.subtract(r_channel, g_channel)
+ return result
+
+ def threshold_segmentation(self, image, threshold, color=255):
+ '''
+ 对图像进行阈值分割,高于阈值的部分设置为指定的颜色。
+ :param image: 输入的单通道图像
+ :param threshold: 阈值
+ :param color: 设置的颜色值
+ :return: 分割后的二值化图像
+ '''
+ _, result = cv2.threshold(image, threshold, color, cv2.THRESH_BINARY)
+ return result
+
+ def bitwise_operation(self, image1, image2, operation='and'):
+ '''
+ 对两幅图像执行位运算(与或运算)。
+ :param image1: 第一幅图像
+ :param image2: 第二幅图像
+ :param operation: 执行的操作类型('and' 或 'or')
+ :return: 位运算后的结果
+ '''
+ if operation == 'and':
+ result = cv2.bitwise_and(image1, image2)
+ elif operation == 'or':
+ result = cv2.bitwise_or(image1, image2)
+ else:
+ raise ValueError("operation must be 'and' or 'or'")
+ return result
+
+ def largest_connected_component(self, bin_img):
+ '''
+ 提取二值图像中的最大连通区域。
+ :param bin_img: 输入的二值图像
+ :return: 只包含最大连通区域的二值图像
+ '''
+ num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(bin_img, connectivity=8)
+ if num_labels <= 1:
+ return np.zeros_like(bin_img)
+ largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
+ new_bin_img = np.zeros_like(bin_img)
+ new_bin_img[labels == largest_label] = 255
+ return new_bin_img
+
+ def close_operation(self, bin_img, kernel_size=(5, 5)):
+ '''
+ 对二值图像进行闭运算,用于消除内部小孔和连接接近的对象。
+ :param bin_img: 输入的二值图像
+ :param kernel_size: 核的大小
+ :return: 进行闭运算后的图像
+ '''
+ kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
+ closed_img = cv2.morphologyEx(bin_img, cv2.MORPH_CLOSE, kernel)
+ return closed_img
+
+ def open_operation(self, bin_img, kernel_size=(5, 5)):
+ '''
+ 对二值图像进行开运算,用于去除小的噪点。
+ :param bin_img: 输入的二值图像
+ :param kernel_size: 核的大小
+ :return: 进行开运算后的图像
+ '''
+ kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
+ opened_img = cv2.morphologyEx(bin_img, cv2.MORPH_OPEN, kernel)
+ return opened_img
+
+ def draw_tomato_edge(self, original_img, bin_img):
+ '''
+ 在原始图像上绘制最大西红柿轮廓的近似多边形。
+ :param original_img: 原始 BGR 图像
+ :param bin_img: 西红柿的二值图像
+ :return: 带有绘制边缘的原始图像和边缘掩码
+ '''
+ bin_img_processed = self.close_operation(bin_img, kernel_size=(15, 15))
+ contours, _ = cv2.findContours(bin_img_processed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
+ if not contours:
+ return original_img, np.zeros_like(bin_img)
+ max_contour = max(contours, key=cv2.contourArea)
+ epsilon = 0.0006 * cv2.arcLength(max_contour, True)
+ approx = cv2.approxPolyDP(max_contour, epsilon, True)
+ cv2.drawContours(original_img, [approx], -1, (0, 255, 0), 3)
+ mask = np.zeros_like(bin_img)
+ cv2.drawContours(mask, [max_contour], -1, (255), thickness=cv2.FILLED)
+ return original_img, mask
+
+ def draw_tomato_edge_convex_hull(self, original_img, bin_img):
+ '''
+ 在原始图像上绘制最大西红柿轮廓的凸包。
+ :param original_img: 原始 BGR 图像
+ :param bin_img: 西红柿的二值图像
+ :return: 带有绘制凸包的原始图像
+ '''
+ bin_img_blurred = cv2.GaussianBlur(bin_img, (5, 5), 0)
+ contours, _ = cv2.findContours(bin_img_blurred, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
+ if not contours:
+ return original_img
+ max_contour = max(contours, key=cv2.contourArea)
+ hull = cv2.convexHull(max_contour)
+ cv2.drawContours(original_img, [hull], -1, (0, 255, 0), 3)
+ return original_img
+
+ def fill_holes(self, bin_img):
+ '''
+ 使用 floodFill 算法填充图像中的孔洞。
+ :param bin_img: 输入的二值图像
+ :return: 填充后的图像
+ '''
+ img_filled = bin_img.copy()
+ height, width = bin_img.shape
+ mask = np.zeros((height + 2, width + 2), np.uint8)
+ cv2.floodFill(img_filled, mask, (0, 0), 255)
+ img_filled_inv = cv2.bitwise_not(img_filled)
+ img_filled = cv2.bitwise_or(bin_img, img_filled_inv)
+ return img_filled
+
+ def bitwise_and_rgb_with_binary(self, rgb_img, bin_img):
+ '''
+ 将 RGB 图像与二值图像进行按位与操作,用于将二值区域应用于原始图像。
+ :param rgb_img: 原始 RGB 图像
+ :param bin_img: 二值图像
+ :return: 按位与后的结果图像
+ '''
+ bin_img_3channel = cv2.cvtColor(bin_img, cv2.COLOR_GRAY2BGR)
+ result = cv2.bitwise_and(rgb_img, bin_img_3channel)
+ return result
+
+ def extract_max_connected_area(self, image, lower_hsv, upper_hsv):
+ '''
+ 提取图像中满足 HSV 范围条件的最大连通区域,并填充孔洞。
+ :param image: 输入的 BGR 图像
+ :param lower_hsv: HSV 范围的下限
+ :param upper_hsv: HSV 范围的上限
+ :return: 处理后的图像
+ '''
+ hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
+ mask = cv2.inRange(hsv, lower_hsv, upper_hsv)
+ num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(mask, connectivity=8)
+ largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
+ new_bin_img = np.zeros_like(mask)
+ new_bin_img[labels == largest_label] = 255
+ img_filled = new_bin_img.copy()
+ height, width = new_bin_img.shape
+ mask = np.zeros((height + 2, width + 2), np.uint8)
+ cv2.floodFill(img_filled, mask, (0, 0), 255)
+ img_filled_inv = cv2.bitwise_not(img_filled)
+ img_filled = cv2.bitwise_or(new_bin_img, img_filled_inv)
+ return img_filled
diff --git a/20240529RGBtest3/main.py b/20240529RGBtest3/main.py
new file mode 100644
index 0000000..6cef35a
--- /dev/null
+++ b/20240529RGBtest3/main.py
@@ -0,0 +1,125 @@
+# -*- coding: utf-8 -*-
+# @Time : 2024/4/20 18:45
+# @Author : TG
+# @File : main.py
+# @Software: PyCharm
+# -*- coding: utf-8 -*-
+# @Time : 2024/4/12 15:04
+# @Author : TG
+# @File : main.py
+# @Software: PyCharm
+
+import socket
+import sys
+import numpy as np
+import cv2
+import root_dir
+import time
+import os
+from root_dir import ROOT_DIR
+import logging
+from utils import create_pipes, receive_rgb_data, send_data, receive_spec_data, analyze_tomato
+from collections import deque
+import time
+import io
+from PIL import Image
+import threading
+import queue
+
+def process_data(img: any) -> tuple:
+ """
+ 处理指令
+
+ :param cmd: 指令类型
+ :param data: 指令内容
+ :param connected_sock: socket
+ :param detector: 模型
+ :return: 是否处理成功
+ """
+ # if cmd == 'IM':
+
+ long_axis, short_axis, number_defects, total_pixels, rp = analyze_tomato(img)
+ return long_axis, short_axis, number_defects, total_pixels, rp
+
+
+## 20240423代码
+def main(is_debug=False):
+ file_handler = logging.FileHandler(os.path.join(ROOT_DIR, 'report.log'))
+ file_handler.setLevel(logging.DEBUG if is_debug else logging.WARNING)
+ console_handler = logging.StreamHandler(sys.stdout)
+ console_handler.setLevel(logging.DEBUG if is_debug else logging.WARNING)
+ logging.basicConfig(format='%(asctime)s %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s',
+ handlers=[file_handler, console_handler],
+ level=logging.DEBUG)
+ rgb_receive_name = r'\\.\pipe\rgb_receive'
+ rgb_send_name = r'\\.\pipe\rgb_send'
+ spec_receive_name = r'\\.\pipe\spec_receive'
+ rgb_receive, rgb_send, spec_receive = create_pipes(rgb_receive_name, rgb_send_name, spec_receive_name)
+
+ # data_size = 15040566
+
+ while True:
+ long_axis_list = []
+ short_axis_list = []
+ defect_num_sum = 0
+ total_defect_area_sum = 0
+ rp = None
+
+ start_time = time.time()
+
+ for i in range(5):
+
+ # start_time = time.time()
+
+
+ img_data = receive_rgb_data(rgb_receive)
+ image = Image.open(io.BytesIO(img_data))
+ img = np.array(image)
+ print(img.shape)
+
+ # end_time = time.time()
+ # elapsed_time = end_time - start_time
+ # print(f'接收时间:{elapsed_time}秒')
+
+ long_axis, short_axis, number_defects, total_pixels, rp = process_data(img=img)
+ # print(long_axis, short_axis, number_defects, type(total_pixels), rp.shape)
+
+ if i <= 2:
+ long_axis_list.append(long_axis)
+ short_axis_list.append(short_axis)
+ if i == 1:
+ rp_result = rp
+
+ defect_num_sum += number_defects
+ total_defect_area_sum += total_pixels
+
+ long_axis = round(sum(long_axis_list) / 3)
+ short_axis = round(sum(short_axis_list) / 3)
+ # print(type(long_axis), type(short_axis), type(defect_num_sum), type(total_defect_area_sum), type(rp_result))
+
+ spec_data = receive_spec_data(spec_receive)
+ print(f'光谱数据接收长度:', len(spec_data))
+
+
+ response = send_data(pipe_send=rgb_send, long_axis=long_axis, short_axis=short_axis,
+ defect_num=defect_num_sum, total_defect_area=total_defect_area_sum, rp=rp_result)
+
+
+
+ end_time = time.time()
+ elapsed_time = (end_time - start_time) * 1000
+ print(f'总时间:{elapsed_time}毫秒')
+
+ print(long_axis, short_axis, defect_num_sum, total_defect_area_sum, rp_result.shape)
+
+
+
+if __name__ == '__main__':
+ # 2个pipe管道
+ # 接收到图片 n_rows * n_cols * 3, uint8
+ # 发送long_axis, short_axis, defect_num_sum, total_defect_area_sum, rp_result
+ main(is_debug=False)
+
+
+
+
diff --git a/20240529RGBtest3/picture.ipynb b/20240529RGBtest3/picture.ipynb
new file mode 100644
index 0000000..6772688
--- /dev/null
+++ b/20240529RGBtest3/picture.ipynb
@@ -0,0 +1,79 @@
+{
+ "cells": [
+ {
+ "cell_type": "code",
+ "id": "initial_id",
+ "metadata": {
+ "collapsed": true,
+ "ExecuteTime": {
+ "end_time": "2024-06-03T08:44:12.688855Z",
+ "start_time": "2024-06-03T08:44:07.661963Z"
+ }
+ },
+ "source": [
+ "import cv2\n",
+ "import numpy as np\n",
+ "\n",
+ "# 读取彩色图像,使用原始字符串处理文件路径\n",
+ "image = cv2.imread(r\"D:\\project\\supermachine--tomato-passion_fruit\\20240529RGBtest3\\data\\bad\\36.bmp\")\n",
+ "\n",
+ "# 将RGB图像转换到HSV颜色空间\n",
+ "hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)\n",
+ "\n",
+ "# 将RGB图像转换到Lab颜色空间\n",
+ "lab_image = cv2.cvtColor(image, cv2.COLOR_BGR2LAB)\n",
+ "\n",
+ "# 提取S分量\n",
+ "s_channel = hsv_image[:,:,1]\n",
+ "\n",
+ "# 提取L分量\n",
+ "l_channel = lab_image[:,:,0]\n",
+ "\n",
+ "# 计算S+L图像\n",
+ "sl_image = cv2.addWeighted(s_channel, 0.5, l_channel, 0.5, 0)\n",
+ "\n",
+ "# 使用Otsu阈值分割\n",
+ "_, otsu_segmentation = cv2.threshold(sl_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)\n",
+ "\n",
+ "# 显示原始图像和分割结果\n",
+ "cv2.imshow(\"Original Image\", image)\n",
+ "cv2.imshow(\"Otsu Segmentation\", otsu_segmentation)\n",
+ "cv2.waitKey(0)\n",
+ "cv2.destroyAllWindows()\n",
+ "#存图\n",
+ "# cv2.imwrite(r\"D:\\project\\supermachine--tomato-passion_fruit\\20240529RGBtest3\\33_otsu.bmp\", otsu_segmentation)\n"
+ ],
+ "outputs": [],
+ "execution_count": 5
+ },
+ {
+ "metadata": {},
+ "cell_type": "code",
+ "outputs": [],
+ "execution_count": null,
+ "source": "",
+ "id": "29d27b11f43683db"
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 2
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython2",
+ "version": "2.7.6"
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 5
+}
diff --git a/20240529RGBtest3/test.py b/20240529RGBtest3/test.py
new file mode 100644
index 0000000..fbd8f6c
--- /dev/null
+++ b/20240529RGBtest3/test.py
@@ -0,0 +1,292 @@
+import cv2
+import numpy as np
+import os
+import argparse
+# from svm import predict_image_array, load_model
+
+
+
+#提取西红柿,使用S+L的图像
+def extract_s_l(image_path):
+ image = cv2.imread(image_path)
+ hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
+ lab = cv2.cvtColor(image, cv2.COLOR_BGR2Lab)
+ s_channel = hsv[:,:,1]
+ l_channel = lab[:,:,0]
+ result = cv2.add(s_channel, l_channel)
+ return result
+
+def find_reflection(image_path, threshold=190):
+ # 读取图像
+ image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
+
+ # 应用阈值分割
+ _, reflection = cv2.threshold(image, threshold, 255, cv2.THRESH_BINARY)
+
+ return reflection
+
+def otsu_threshold(image):
+
+ # 将图像转换为灰度图像
+ # gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
+
+ # 使用Otsu阈值分割
+ _, binary = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
+
+ return binary
+
+# 提取花萼,使用G-R的图像
+def extract_g_r(image):
+ # image = cv2.imread(image_path)
+ g_channel = image[:,:,1]
+ r_channel = image[:,:,2]
+ result = cv2.subtract(cv2.multiply(g_channel, 1.5), r_channel)
+ return result
+
+
+#提取西红柿,使用R-B的图像
+def extract_r_b(image_path):
+ image = cv2.imread(image_path)
+ r_channel = image[:,:,2]
+ b_channel = image[:,:,0]
+ result = cv2.subtract(r_channel, b_channel)
+ return result
+
+def extract_r_g(image_path):
+ image = cv2.imread(image_path)
+ r_channel = image[:,:,2]
+ g_channel = image[:,:,1]
+ result = cv2.subtract(r_channel, g_channel)
+ return result
+
+def threshold_segmentation(image, threshold, color=255):
+ _, result = cv2.threshold(image, threshold, color, cv2.THRESH_BINARY)
+ return result
+
+def bitwise_operation(image1, image2, operation='and'):
+ if operation == 'and':
+ result = cv2.bitwise_and(image1, image2)
+ elif operation == 'or':
+ result = cv2.bitwise_or(image1, image2)
+ else:
+ raise ValueError("operation must be 'and' or 'or'")
+ return result
+
+def largest_connected_component(bin_img):
+ # 使用connectedComponentsWithStats函数找到连通区域
+ num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(bin_img, connectivity=8)
+
+ # 找到最大的连通区域(除了背景)
+ largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
+
+ # 创建一个新的二值图像,只显示最大的连通区域
+ new_bin_img = np.zeros_like(bin_img)
+ new_bin_img[labels == largest_label] = 255
+
+ return new_bin_img
+
+def close_operation(bin_img, kernel_size=(5, 5)):
+ kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
+ closed_img = cv2.morphologyEx(bin_img, cv2.MORPH_CLOSE, kernel)
+ return closed_img
+
+def open_operation(bin_img, kernel_size=(5, 5)):
+ kernel = cv2.getStructuringElement(cv2.MORPH_RECT, kernel_size)
+ opened_img = cv2.morphologyEx(bin_img, cv2.MORPH_OPEN, kernel)
+ return opened_img
+
+
+def draw_tomato_edge(original_img, bin_img):
+ bin_img_processed = close_operation(bin_img, kernel_size=(15, 15))
+ # cv2.imshow('Close Operation', bin_img_processed)
+ # bin_img_processed = open_operation(bin_img_processed, kernel_size=(19, 19))
+ # cv2.imshow('Open Operation', bin_img_processed)
+ # 现在使用处理后的bin_img_processed查找轮廓
+ contours, _ = cv2.findContours(bin_img_processed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
+
+ # 如果没有找到轮廓,直接返回原图
+ if not contours:
+ return original_img
+ # 找到最大轮廓
+ max_contour = max(contours, key=cv2.contourArea)
+ # 多边形近似的精度调整
+ epsilon = 0.0006 * cv2.arcLength(max_contour, True) # 可以调整这个值
+ approx = cv2.approxPolyDP(max_contour, epsilon, True)
+ # 绘制轮廓
+ cv2.drawContours(original_img, [approx], -1, (0, 255, 0), 3)
+ mask = np.zeros_like(bin_img)
+
+ # 使用白色填充最大轮廓
+ cv2.drawContours(mask, [max_contour], -1, (255), thickness=cv2.FILLED)
+
+ return original_img, mask
+
+def draw_tomato_edge_convex_hull(original_img, bin_img):
+ bin_img_blurred = cv2.GaussianBlur(bin_img, (5, 5), 0)
+ contours, _ = cv2.findContours(bin_img_blurred, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
+ if not contours:
+ return original_img
+ max_contour = max(contours, key=cv2.contourArea)
+ hull = cv2.convexHull(max_contour)
+ cv2.drawContours(original_img, [hull], -1, (0, 255, 0), 3)
+ return original_img
+
+# 得到完整的西红柿二值图像,除了绿色花萼
+def fill_holes(bin_img):
+ # 复制 bin_img 到 img_filled
+ img_filled = bin_img.copy()
+
+ # 获取图像的高度和宽度
+ height, width = bin_img.shape
+
+ # 创建一个掩码,比输入图像大两个像素点
+ mask = np.zeros((height + 2, width + 2), np.uint8)
+
+ # 使用 floodFill 函数填充黑色区域
+ cv2.floodFill(img_filled, mask, (0, 0), 255)
+
+ # 反转填充后的图像
+ img_filled_d = cv2.bitwise_not(img_filled)
+
+ # 使用 bitwise_or 操作合并原图像和填充后的图像
+ img_filled = cv2.bitwise_or(bin_img, img_filled)
+ # 裁剪 img_filled 和 img_filled_d 到与 bin_img 相同的大小
+ # img_filled = img_filled[:height, :width]
+ img_filled_d = img_filled_d[:height, :width]
+
+ return img_filled, img_filled_d
+
+def bitwise_and_rgb_with_binary(rgb_img, bin_img):
+ # 将二值图像转换为三通道图像
+ bin_img_3channel = cv2.cvtColor(bin_img, cv2.COLOR_GRAY2BGR)
+
+ # 使用 bitwise_and 操作合并 RGB 图像和二值图像
+ result = cv2.bitwise_and(rgb_img, bin_img_3channel)
+
+ return result
+
+
+def extract_max_connected_area(image_path, lower_hsv, upper_hsv):
+ # 读取图像
+ image = cv2.imread(image_path)
+
+ # 将图像从BGR转换到HSV
+ hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
+
+ # 使用阈值获取指定区域的二值图像
+ mask = cv2.inRange(hsv, lower_hsv, upper_hsv)
+
+ # 找到二值图像的连通区域
+ num_labels, labels, stats, _ = cv2.connectedComponentsWithStats(mask, connectivity=8)
+
+ # 找到最大的连通区域(除了背景)
+ largest_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA])
+
+ # 创建一个新的二值图像,只显示最大的连通区域
+ new_bin_img = np.zeros_like(mask)
+ new_bin_img[labels == largest_label] = 255
+
+ # 复制 new_bin_img 到 img_filled
+ img_filled = new_bin_img.copy()
+
+ # 获取图像的高度和宽度
+ height, width = new_bin_img.shape
+
+ # 创建一个掩码,比输入图像大两个像素点
+ mask = np.zeros((height + 2, width + 2), np.uint8)
+
+ # 使用 floodFill 函数填充黑色区域
+ cv2.floodFill(img_filled, mask, (0, 0), 255)
+
+ # 反转填充后的图像
+ img_filled_inv = cv2.bitwise_not(img_filled)
+
+ # 使用 bitwise_or 操作合并原图像和填充后的图像
+ img_filled = cv2.bitwise_or(new_bin_img, img_filled_inv)
+
+ return img_filled
+
+
+
+
+def main():
+ parser = argparse.ArgumentParser(description='Process some integers.')
+ parser.add_argument('--dir_path', type=str, default=r'D:\project\supermachine--tomato-passion_fruit\20240529RGBtest3\data\broken',
+ help='the directory path of images')
+ parser.add_argument('--threshold_s_l', type=int, default=180,
+ help='the threshold for s_l')
+ parser.add_argument('--threshold_r_b', type=int, default=15,
+ help='the threshold for r_b')
+
+ args = parser.parse_args()
+
+ for img_file in os.listdir(args.dir_path):
+ if img_file.endswith('.bmp'):
+ img_path = os.path.join(args.dir_path, img_file)
+ s_l = extract_s_l(img_path)
+ otsu_thresholded = otsu_threshold(s_l)
+ img_fore = bitwise_and_rgb_with_binary(cv2.imread(img_path), otsu_thresholded)
+ img_fore_defect = extract_g_r(img_fore)
+ img_fore_defect = threshold_segmentation(img_fore_defect, args.threshold_r_b)
+ # cv2.imshow('img_fore_defect', img_fore_defect)
+ thresholded_s_l = threshold_segmentation(s_l, args.threshold_s_l)
+ new_bin_img = largest_connected_component(thresholded_s_l)
+ # zhongggggg = cv2.bitwise_or(new_bin_img, cv2.imread('defect_mask.bmp', cv2.IMREAD_GRAYSCALE))
+ # cv2.imshow('zhongggggg', zhongggggg)
+ new_otsu_bin_img = largest_connected_component(otsu_thresholded)
+ filled_img, defect = fill_holes(new_bin_img)
+ defect = bitwise_and_rgb_with_binary(cv2.imread(img_path), defect)
+ cv2.imshow('defect', defect)
+ edge, mask = draw_tomato_edge(cv2.imread(img_path), new_bin_img)
+ org_defect = bitwise_and_rgb_with_binary(edge, new_bin_img)
+ fore = bitwise_and_rgb_with_binary(cv2.imread(img_path), mask)
+ fore_g_r_t = threshold_segmentation(extract_g_r(fore), 20)
+ fore_g_r_t_ture = bitwise_and_rgb_with_binary(cv2.imread(img_path), fore_g_r_t)
+ cv2.imwrite('defect_big.bmp', fore_g_r_t_ture)
+ res = cv2.bitwise_or(new_bin_img, fore_g_r_t)
+ white = find_reflection(img_path)
+
+ # SVM预测
+ # 加载模型
+ # model, scaler = load_model('/Users/xs/PycharmProjects/super-tomato/svm_green.joblib')
+
+ # 对图像进行预测
+ # predicted_mask = predict_image_array(image, model, scaler)
+
+
+
+ cv2.imshow('white', white)
+
+ cv2.imshow('fore', fore)
+ cv2.imshow('fore_g_r_t', fore_g_r_t)
+ cv2.imshow('mask', mask)
+ print('mask', mask.shape)
+ print('filled', filled_img.shape)
+ print('largest', new_bin_img.shape)
+ print('rp', org_defect.shape)
+ cv2.imshow('res', res)
+
+
+
+ # 显示原始图像
+ original_img = cv2.imread(img_path)
+ cv2.imshow('Original', original_img)
+ cv2.imshow('thresholded_s_l', thresholded_s_l)
+ cv2.imshow('Largest Connected Component', new_bin_img)
+ cv2.imshow('Filled', filled_img)
+ cv2.imshow('Defect', defect)
+ cv2.imshow('Org_defect', org_defect)
+ cv2.imshow('otsu_thresholded', new_otsu_bin_img)
+
+
+ #显示轮廓
+ cv2.imshow('Edge', edge)
+
+ # 等待用户按下任意键
+ cv2.waitKey(0)
+
+ # 关闭所有窗口
+ cv2.destroyAllWindows()
+
+if __name__ == '__main__':
+ main()
\ No newline at end of file
diff --git a/20240529RGBtest3/utils.py b/20240529RGBtest3/utils.py
new file mode 100644
index 0000000..5a73307
--- /dev/null
+++ b/20240529RGBtest3/utils.py
@@ -0,0 +1,280 @@
+# -*- coding: utf-8 -*-
+# @Time : 2024/4/20 18:24
+# @Author : TG
+# @File : utils.py
+# @Software: PyCharm
+
+import time
+import logging
+import numpy as np
+import shutil
+import cv2
+import os
+from scipy.ndimage.measurements import label, find_objects
+import win32pipe
+import win32file
+import io
+from PIL import Image
+import select
+import msvcrt
+from classifer import Tomato
+
+def receive_rgb_data(pipe):
+ try:
+ # 读取图片数据
+ len_img = win32file.ReadFile(pipe, 4, None)
+ data_size = int.from_bytes(len_img[1], byteorder='big')
+ result, img_data = win32file.ReadFile(pipe, data_size, None)
+ return img_data
+ except Exception as e:
+ print(f"数据接收失败,错误原因: {e}")
+ return None
+
+
+def receive_spec_data(pipe):
+ try:
+ # 读取图片数据长度
+ len_spec = win32file.ReadFile(pipe, 4, None)
+ if len_spec is None:
+ # 未能读取到数据长度,返回"0"
+ return "0"
+ data_size = int.from_bytes(len_spec[1], byteorder='big')
+ if data_size == 0:
+ # 接收到空数据,返回"0"
+ return "0"
+
+ # 读取图片数据
+ result, spec_data = win32file.ReadFile(pipe, data_size, None)
+ return spec_data
+ except Exception as e:
+ print(f"数据接收失败,错误原因: {e}")
+ return '0'
+
+def create_pipes(rgb_receive_name, rgb_send_name, spec_receive_name):
+ while True:
+ try:
+ # 打开或创建命名管道
+ rgb_receive = win32pipe.CreateNamedPipe(
+ rgb_receive_name,
+ win32pipe.PIPE_ACCESS_INBOUND,
+ win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
+ 1, 80000000, 80000000, 0, None
+ )
+ rgb_send = win32pipe.CreateNamedPipe(
+ rgb_send_name,
+ win32pipe.PIPE_ACCESS_OUTBOUND, # 修改为输出模式
+ win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
+ 1, 80000000, 80000000, 0, None
+ )
+ spec_receive = win32pipe.CreateNamedPipe(
+ spec_receive_name,
+ win32pipe.PIPE_ACCESS_INBOUND,
+ win32pipe.PIPE_TYPE_BYTE | win32pipe.PIPE_WAIT,
+ 1, 200000000, 200000000, 0, None
+ )
+ print("pipe管道创建成功,等待连接...")
+ # 等待发送端连接
+ win32pipe.ConnectNamedPipe(rgb_receive, None)
+ print("rgb_receive connected.")
+ # 等待发送端连接
+ win32pipe.ConnectNamedPipe(rgb_send, None)
+ print("rgb_send connected.")
+ win32pipe.ConnectNamedPipe(rgb_receive, None)
+ print("spec_receive connected.")
+ return rgb_receive, rgb_send, spec_receive
+
+ except Exception as e:
+ print(f"管道创建连接失败,失败原因: {e}")
+ print("等待5秒后重试...")
+ time.sleep(5)
+ continue
+
+def send_data(pipe_send, long_axis, short_axis, defect_num, total_defect_area, rp):
+ # start_time = time.time()
+ #
+ rp1 = Image.fromarray(rp.astype(np.uint8))
+ # cv2.imwrite('rp1.bmp', rp1)
+
+ # 将 Image 对象保存到 BytesIO 流中
+ img_bytes = io.BytesIO()
+ rp1.save(img_bytes, format='BMP')
+ img_bytes = img_bytes.getvalue()
+
+ # width = rp.shape[0]
+ # height = rp.shape[1]
+ # print(width, height)
+ # img_bytes = rp.tobytes()
+ # length = len(img_bytes) + 18
+ # print(length)
+ # length = length.to_bytes(4, byteorder='big')
+ # width = width.to_bytes(2, byteorder='big')
+ # height = height.to_bytes(2, byteorder='big')
+
+ print(f'原始长度:', len(rp.tobytes()))
+ print(f'发送长度:', len(img_bytes))
+
+ long_axis = long_axis.to_bytes(2, byteorder='big')
+ short_axis = short_axis.to_bytes(2, byteorder='big')
+ defect_num = defect_num.to_bytes(2, byteorder='big')
+ total_defect_area = int(total_defect_area).to_bytes(4, byteorder='big')
+ length = (len(img_bytes) + 4).to_bytes(4, byteorder='big')
+ # cmd_type = 'RIM'
+ # result = result.encode('ascii')
+ # send_message = b'\xaa' + length + (' ' + cmd_type).upper().encode('ascii') + long_axis + short_axis + defect_num + total_defect_area + width + height + img_bytes + b'\xff\xff\xbb'
+ # send_message = long_axis + short_axis + defect_num + total_defect_area + img_bytes
+ send_message = long_axis + short_axis + defect_num + total_defect_area + length + img_bytes
+ # print(long_axis)
+ # print(short_axis)
+ # print(defect_num)
+ # print(total_defect_area)
+ # print(width)
+ # print(height)
+
+ try:
+ win32file.WriteFile(pipe_send, send_message)
+ time.sleep(0.01)
+ print('发送成功')
+ # print(len(send_message))
+ except Exception as e:
+ logging.error(f'发送完成指令失败,错误类型:{e}')
+ return False
+
+ # end_time = time.time()
+ # print(f'发送时间:{end_time - start_time}秒')
+
+ return True
+
+
+
+def mkdir_if_not_exist(dir_name, is_delete=False):
+ """
+ 创建文件夹
+ :param dir_name: 文件夹
+ :param is_delete: 是否删除
+ :return: 是否成功
+ """
+ try:
+ if is_delete:
+ if os.path.exists(dir_name):
+ shutil.rmtree(dir_name)
+ print('[Info] 文件夹 "%s" 存在, 删除文件夹.' % dir_name)
+
+ if not os.path.exists(dir_name):
+ os.makedirs(dir_name)
+ print('[Info] 文件夹 "%s" 不存在, 创建文件夹.' % dir_name)
+ return True
+ except Exception as e:
+ print('[Exception] %s' % e)
+ return False
+
+def create_file(file_name):
+ """
+ 创建文件
+ :param file_name: 文件名
+ :return: None
+ """
+ if os.path.exists(file_name):
+ print("文件存在:%s" % file_name)
+ return False
+ # os.remove(file_name) # 删除已有文件
+ if not os.path.exists(file_name):
+ print("文件不存在,创建文件:%s" % file_name)
+ open(file_name, 'a').close()
+ return True
+
+
+class Logger(object):
+ def __init__(self, is_to_file=False, path=None):
+ self.is_to_file = is_to_file
+ if path is None:
+ path = "tomato.log"
+ self.path = path
+ create_file(path)
+
+ def log(self, content):
+ if self.is_to_file:
+ with open(self.path, "a") as f:
+ print(time.strftime("[%Y-%m-%d_%H-%M-%S]:"), file=f)
+ print(content, file=f)
+ else:
+ print(content)
+
+
+
+
+def get_tomato_dimensions(edge_img):
+ """
+ 根据边缘二值化轮廓图,计算果子的长径、短径和长短径比值。
+ 使用最小外接矩形和最小外接圆两种方法。
+
+ 参数:
+ edge_img (numpy.ndarray): 边缘二值化轮廓图,背景为黑色,番茄区域为白色。
+
+ 返回:
+ tuple: (长径, 短径, 长短径比值)
+ """
+ if edge_img is None or edge_img.any() == 0:
+ return (0, 0)
+ # 最小外接矩形
+ rect = cv2.minAreaRect(cv2.findContours(edge_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0][0])
+ major_axis, minor_axis = rect[1]
+ # aspect_ratio = max(major_axis, minor_axis) / min(major_axis, minor_axis)
+
+ # # 最小外接圆
+ # (x, y), radius = cv2.minEnclosingCircle(
+ # cv2.findContours(edge_img, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)[0][0])
+ # diameter = 2 * radius
+ # aspect_ratio_circle = 1.0
+
+ return (max(major_axis, minor_axis), min(major_axis, minor_axis))
+
+def get_defect_info(defect_img):
+ """
+ 根据区域缺陷二值化轮廓图,计算缺陷区域的个数和总面积。
+
+ 参数:
+ defect_img (numpy.ndarray): 番茄区域缺陷二值化轮廓图,背景为黑色,番茄区域为白色,缺陷区域为黑色连通域。
+
+ 返回:
+ tuple: (缺陷区域个数, 缺陷区域像素面积,缺陷像素总面积)
+ """
+ # 检查输入是否为空
+ if defect_img is None or defect_img.any() == 0:
+ return (0, 0)
+
+ nb_components, output, stats, centroids = cv2.connectedComponentsWithStats(defect_img, connectivity=4)
+ max_area = max(stats[i, cv2.CC_STAT_AREA] for i in range(1, nb_components))
+ areas = []
+ for i in range(1, nb_components):
+ area = stats[i, cv2.CC_STAT_AREA]
+ if area != max_area:
+ areas.append(area)
+ number_defects = len(areas)
+ total_pixels = sum(areas)
+ return number_defects, total_pixels
+
+def analyze_tomato(img):
+ """
+ 分析给定图像,提取和返回西红柿的长径、短径、缺陷数量和缺陷总面积,并返回处理后的图像。
+ 使用 Tomoto 类的图像处理方法,以及自定义的尺寸和缺陷信息获取函数。
+ 参数:
+ img (numpy.ndarray): 输入的 BGR 图像
+ 返回:
+ tuple: (长径, 短径, 缺陷区域个数, 缺陷区域总像素, 处理后的图像)
+ """
+ tomato = Tomato() # 创建 Tomato 类的实例
+ # 设置 S-L 通道阈值并处理图像
+ threshold_s_l = 180
+ s_l = tomato.extract_s_l(img)
+ thresholded_s_l = tomato.threshold_segmentation(s_l, threshold_s_l)
+ new_bin_img = tomato.largest_connected_component(thresholded_s_l)
+ # 绘制西红柿边缘并获取缺陷信息
+ edge, mask = tomato.draw_tomato_edge(img, new_bin_img)
+ org_defect = tomato.bitwise_and_rgb_with_binary(edge, new_bin_img)
+ # 获取西红柿的尺寸信息
+ long_axis, short_axis = get_tomato_dimensions(mask)
+ # 获取缺陷信息
+ number_defects, total_pixels = get_defect_info(new_bin_img)
+ # 将处理后的图像转换为 RGB 格式
+ rp = cv2.cvtColor(org_defect, cv2.COLOR_BGR2RGB)
+ return long_axis, short_axis, number_defects, total_pixels, rp
diff --git a/20240529RGBtest3/xs/dimensionality_reduction.py b/20240529RGBtest3/xs/dimensionality_reduction.py
new file mode 100644
index 0000000..b9e266f
--- /dev/null
+++ b/20240529RGBtest3/xs/dimensionality_reduction.py
@@ -0,0 +1,64 @@
+import numpy as np
+import matplotlib.pyplot as plt
+from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
+from sklearn.svm import SVR
+from sklearn.neighbors import KNeighborsRegressor
+from sklearn.model_selection import train_test_split
+from sklearn.metrics import mean_squared_error
+from spec_read import all_spectral_data
+
+def prepare_data(data):
+ """Reshape data and select specified spectral bands."""
+ reshaped_data = data.reshape(100, -1)
+ selected_bands = [1, 2, 3, 58, 59, 60, 106, 107, 108, 112, 113, 114, 142, 146, 200, 201, 202]
+ return reshaped_data[:, selected_bands]
+
+def split_data(X, y, test_size=0.20, random_state=1):
+ """Split data into training and test sets."""
+ return train_test_split(X, y, test_size=test_size, random_state=random_state)
+
+def evaluate_model(model, X_test, y_test):
+ """Evaluate the model and return MSE and predictions."""
+ y_pred = model.predict(X_test)
+ mse = mean_squared_error(y_test, y_pred)
+ return mse, y_pred
+
+def print_predictions(y_test, y_pred, model_name):
+ """Print actual and predicted values."""
+ print(f"Test Set Predictions for {model_name}:")
+ for i, (real, pred) in enumerate(zip(y_test, y_pred)):
+ print(f"Sample {i + 1}: True Value = {real:.2f}, Predicted Value = {pred:.2f}")
+
+def main():
+ sweetness_acidity = np.array([
+ 16.2, 16.1, 17, 16.9, 16.8, 17.8, 18.1, 17.2, 17, 17.2, 17.1, 17.2,
+ 17.2, 17.2, 18.1, 17, 17.6, 17.4, 17.1, 17.1, 16.9, 17.6, 17.3, 16.3,
+ 16.5, 18.7, 17.6, 16.2, 16.8, 17.2, 16.8, 17.3, 16, 16.6, 16.7, 16.7,
+ 17.3, 16.3, 16.8, 17.4, 17.3, 16.3, 16.1, 17.2, 18.6, 16.8, 16.1, 17.2,
+ 18.3, 16.5, 16.6, 17, 17, 17.8, 16.4, 18, 17.7, 17, 18.3, 16.8, 17.5,
+ 17.7, 18.5, 18, 17.7, 17, 18.3, 18.1, 17.4, 17.7, 17.8, 16.3, 17.1, 16.8,
+ 17.2, 17.5, 16.6, 17.7, 17.1, 17.7, 19.4, 20.3, 17.3, 15.8, 18, 17.7,
+ 17.2, 15.2, 18, 18.4, 18.3, 15.7, 17.2, 18.6, 15.6, 17, 16.9, 17.4, 17.8,
+ 16.5
+ ])
+
+ X = prepare_data(all_spectral_data)
+ X_train, X_test, y_train, y_test = split_data(X, sweetness_acidity)
+
+ models = {
+ "RandomForest": RandomForestRegressor(n_estimators=100),
+ "GradientBoosting": GradientBoostingRegressor(n_estimators=100),
+ "SVR": SVR(kernel='rbf', C=100, gamma=0.1, epsilon=.1),
+ "KNeighbors": KNeighborsRegressor(n_neighbors=5)
+ }
+
+ for model_name, model in models.items():
+ model.fit(X_train, y_train)
+ mse, y_pred = evaluate_model(model, X_test, y_test)
+ print(f"Model: {model_name}")
+ print(f"Mean Squared Error on the test set: {mse}")
+ print_predictions(y_test, y_pred, model_name)
+ print("\n" + "-"*50 + "\n")
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/20240529RGBtest3/xs/hsv.py b/20240529RGBtest3/xs/hsv.py
new file mode 100644
index 0000000..f06a7ad
--- /dev/null
+++ b/20240529RGBtest3/xs/hsv.py
@@ -0,0 +1,89 @@
+import cv2
+import numpy as np
+import matplotlib.pyplot as plt
+import os
+
+def create_mask(hsv_image, hue_value, hue_delta, value_target, value_delta):
+ # 创建H通道阈值掩码
+ lower_hue = np.array([hue_value - hue_delta, 0, 0])
+ upper_hue = np.array([hue_value + hue_delta, 255, 255])
+ hue_mask = cv2.inRange(hsv_image, lower_hue, upper_hue)
+
+ # 创建V通道排除中心值的掩码
+ lower_value_1 = np.array([0, 0, 0])
+ upper_value_1 = np.array([180, 255, value_target - value_delta])
+ lower_value_2 = np.array([0, 0, value_target + value_delta])
+ upper_value_2 = np.array([180, 255, 255])
+
+ value_mask_1 = cv2.inRange(hsv_image, lower_value_1, upper_value_1)
+ value_mask_1 = cv2.bitwise_not(value_mask_1)
+ cv2.imshow('value_mask_1', value_mask_1)
+ value_mask_2 = cv2.inRange(hsv_image, lower_value_2, upper_value_2)
+ cv2.imshow('value_mask_2', value_mask_2)
+ value_mask = cv2.bitwise_and(value_mask_1, value_mask_2)
+ cv2.imshow('value_mask', value_mask)
+ # 等待用户按下任意键
+ cv2.waitKey(0)
+
+ # 关闭所有窗口
+ cv2.destroyAllWindows()
+
+ # 合并H通道和V通道掩码
+ return cv2.bitwise_and(hue_mask, value_mask)
+
+def apply_morphology(mask):
+ kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
+ return cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
+
+def find_largest_component(mask):
+ num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(mask, 4, cv2.CV_32S)
+ if num_labels < 2:
+ return None # No significant components found
+ max_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA]) # Skip background
+ return (labels == max_label).astype(np.uint8) * 255
+
+def process_image(image_path, hue_value=37, hue_delta=10, value_target=25, value_delta=10):
+ image = cv2.imread(image_path)
+ if image is None:
+ print(f"Error: Image at {image_path} could not be read.")
+ return None
+
+ hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
+ combined_mask = create_mask(hsv_image, hue_value, hue_delta, value_target, value_delta)
+ combined_mask = apply_morphology(combined_mask)
+ max_mask = find_largest_component(combined_mask)
+ cv2.imshow('max_mask', max_mask)
+ # 等待用户按下任意键
+ cv2.waitKey(0)
+ # 关闭所有窗口
+ cv2.destroyAllWindows()
+
+ if max_mask is None:
+ print(f"No significant components found in {image_path}.")
+ return None
+
+ result_image = cv2.bitwise_and(image, image, mask=max_mask)
+ result_image[max_mask == 0] = [255, 255, 255] # Set background to white
+ return result_image
+
+def save_image(image, output_path):
+ cv2.imwrite(output_path, image)
+
+def process_images_in_folder(input_folder, output_folder):
+ if not os.path.exists(output_folder):
+ os.makedirs(output_folder)
+
+ for filename in os.listdir(input_folder):
+ if filename.lower().endswith(".bmp"):
+ image_path = os.path.join(input_folder, filename)
+ result_image = process_image(image_path)
+ if result_image is not None:
+ output_path = os.path.join(output_folder, filename)
+ save_image(result_image, output_path)
+ print(f"Processed and saved {filename} to {output_folder}.")
+
+
+# 主函数调用
+input_folder = r'D:\project\supermachine--tomato-passion_fruit\20240529RGBtest3\data\passion_fruit_img' # 替换为你的输入文件夹路径
+output_folder = r'D:\project\supermachine--tomato-passion_fruit\20240529RGBtest3\data\01' # 替换为你的输出文件夹路径
+process_images_in_folder(input_folder, output_folder)
\ No newline at end of file
diff --git a/20240529RGBtest3/xs/mean.py b/20240529RGBtest3/xs/mean.py
new file mode 100644
index 0000000..d3d1505
--- /dev/null
+++ b/20240529RGBtest3/xs/mean.py
@@ -0,0 +1,71 @@
+import numpy as np
+import matplotlib.pyplot as plt
+from sklearn.ensemble import RandomForestRegressor
+from sklearn.model_selection import train_test_split
+from sklearn.metrics import mean_squared_error
+from spec_read import all_spectral_data
+
+def prepare_data(data):
+ """Calculate the average spectral values for each fruit across all pixels."""
+ return np.mean(data, axis=(1, 2))
+
+def train_model(X, y):
+ """Train a RandomForest model."""
+ rf = RandomForestRegressor(n_estimators=100)
+ rf.fit(X, y)
+ return rf
+
+def split_data(X, y, test_size=0.20, random_state=42):
+ """Split data into training and test sets."""
+ return train_test_split(X, y, test_size=test_size, random_state=random_state)
+
+def evaluate_model(model, X_test, y_test):
+ """Evaluate the model and return MSE and predictions."""
+ y_pred = model.predict(X_test)
+ mse = mean_squared_error(y_test, y_pred)
+ return mse, y_pred
+
+def print_predictions(y_test, y_pred):
+ """Print actual and predicted values."""
+ print("Test Set Predictions:")
+ for i, (real, pred) in enumerate(zip(y_test, y_pred)):
+ print(f"Sample {i + 1}: True Value = {real:.2f}, Predicted Value = {pred:.2f}")
+
+def plot_spectra(X, y):
+ """Plot the average spectra for all samples and annotate with sweetness_acidity values."""
+ plt.figure(figsize=(10, 6))
+ for i in range(X.shape[0]):
+ plt.plot(X[i], label=f'Sample {i+1}')
+ plt.annotate(f'{y[i]:.1f}', xy=(len(X[i])-1, X[i][-1]), xytext=(5, 0),
+ textcoords='offset points', ha='left', va='center')
+ plt.xlabel('Wavelength Index')
+ plt.ylabel('Average Spectral Value')
+ plt.title('Average Spectral Curves for All Samples')
+ plt.legend(loc='upper right', bbox_to_anchor=(1.1, 1.05))
+ plt.show()
+
+def main():
+ sweetness_acidity = np.array([
+ 16.2, 16.1, 17, 16.9, 16.8, 17.8, 18.1, 17.2, 17, 17.2, 17.1, 17.2,
+ 17.2, 17.2, 18.1, 17, 17.6, 17.4, 17.1, 17.1, 16.9, 17.6, 17.3, 16.3,
+ 16.5, 18.7, 17.6, 16.2, 16.8, 17.2, 16.8, 17.3, 16, 16.6, 16.7, 16.7,
+ 17.3, 16.3, 16.8, 17.4, 17.3, 16.3, 16.1, 17.2, 18.6, 16.8, 16.1, 17.2,
+ 18.3, 16.5, 16.6, 17, 17, 17.8, 16.4, 18, 17.7, 17, 18.3, 16.8, 17.5,
+ 17.7, 18.5, 18, 17.7, 17, 18.3, 18.1, 17.4, 17.7, 17.8, 16.3, 17.1, 16.8,
+ 17.2, 17.5, 16.6, 17.7, 17.1, 17.7, 19.4, 20.3, 17.3, 15.8, 18, 17.7,
+ 17.2, 15.2, 18, 18.4, 18.3, 15.7, 17.2, 18.6, 15.6, 17, 16.9, 17.4, 17.8,
+ 16.5
+ ])
+
+ X = prepare_data(all_spectral_data)
+ plot_spectra(X, sweetness_acidity) # 绘制光谱曲线并添加标注
+ X_train, X_test, y_train, y_test = split_data(X, sweetness_acidity)
+ rf_model = train_model(X_train, y_train)
+ mse, y_pred = evaluate_model(rf_model, X_test, y_test)
+
+ print("Transformed data shape:", X_train.shape)
+ print("Mean Squared Error on the test set:", mse)
+ print_predictions(y_test, y_pred)
+
+if __name__ == "__main__":
+ main()
\ No newline at end of file
diff --git a/20240529RGBtest3/xs/rgb.py b/20240529RGBtest3/xs/rgb.py
new file mode 100644
index 0000000..8aa3af1
--- /dev/null
+++ b/20240529RGBtest3/xs/rgb.py
@@ -0,0 +1,70 @@
+import cv2
+import numpy as np
+import matplotlib.pyplot as plt
+
+def dual_threshold_and_max_component(image_path, hue_value=37, hue_delta=10, value_target=30, value_delta=10):
+ # 读取图像
+ image = cv2.imread(image_path)
+
+ # 检查图像是否读取成功
+ if image is None:
+ print("Error: Image could not be read.")
+ return
+
+ # 将图像从BGR转换到HSV色彩空间
+ hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
+
+ # 创建H通道阈值掩码
+ lower_hue = np.array([hue_value - hue_delta, 0, 0])
+ upper_hue = np.array([hue_value + hue_delta, 255, 255])
+ hue_mask = cv2.inRange(hsv_image, lower_hue, upper_hue)
+
+ # 创建V通道排除中心值的掩码
+ lower_value_1 = np.array([0, 0, 0])
+ upper_value_1 = np.array([180, 255, value_target - value_delta])
+ lower_value_2 = np.array([0, 0, value_target + value_delta])
+ upper_value_2 = np.array([180, 255, 255])
+
+ value_mask_1 = cv2.inRange(hsv_image, lower_value_1, upper_value_1)
+ value_mask_2 = cv2.inRange(hsv_image, lower_value_2, upper_value_2)
+ value_mask = cv2.bitwise_or(value_mask_1, value_mask_2)
+
+ # 合并H通道和V通道掩码
+ combined_mask = cv2.bitwise_and(hue_mask, value_mask)
+
+ # 形态学操作 - 开运算,去除小的粘连
+ kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
+ combined_mask = cv2.morphologyEx(combined_mask, cv2.MORPH_OPEN, kernel)
+
+ # 连通域分析
+ num_labels, labels, stats, centroids = cv2.connectedComponentsWithStats(combined_mask, 4, cv2.CV_32S)
+
+ # 找出最大的连通区域(除了背景)
+ max_label = 1 + np.argmax(stats[1:, cv2.CC_STAT_AREA]) # 跳过背景
+ max_mask = (labels == max_label).astype(np.uint8) * 255
+
+ # 使用掩码生成结果图像
+ result_image = cv2.bitwise_and(image, image, mask=max_mask)
+ # 设置背景为白色
+ result_image[max_mask == 0] = [255, 255, 255]
+
+ # 将结果图像从BGR转换到RGB以便正确显示
+ result_image_rgb = cv2.cvtColor(result_image, cv2.COLOR_BGR2RGB)
+
+ # 使用matplotlib显示原始图像和结果图像
+ plt.figure(figsize=(10, 5))
+ plt.subplot(1, 2, 1)
+ plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
+ plt.title('Original Image')
+ plt.axis('off')
+
+ plt.subplot(1, 2, 2)
+ plt.imshow(result_image_rgb)
+ plt.title('Largest Connected Component on White Background')
+ plt.axis('off')
+
+ plt.show()
+
+# 使用函数
+image_path = r'D:\project\supermachine--tomato-passion_fruit\20240529RGBtest3\data\passion_fruit_img\50.bmp' # 替换为你的图片路径
+dual_threshold_and_max_component(image_path)
\ No newline at end of file
diff --git a/20240529RGBtest3/xs/spec_read.py b/20240529RGBtest3/xs/spec_read.py
new file mode 100644
index 0000000..8dc036b
--- /dev/null
+++ b/20240529RGBtest3/xs/spec_read.py
@@ -0,0 +1,70 @@
+import numpy as np
+import os
+
+
+def read_spectral_data(hdr_path, raw_path):
+ # Read HDR file for image dimensions information
+ with open(hdr_path, 'r', encoding='latin1') as hdr_file:
+ lines = hdr_file.readlines()
+ height = width = bands = 0
+ for line in lines:
+ if line.startswith('lines'):
+ height = int(line.split()[-1])
+ elif line.startswith('samples'):
+ width = int(line.split()[-1])
+ elif line.startswith('bands'):
+ bands = int(line.split()[-1])
+
+ # Read spectral data from RAW file
+ raw_image = np.fromfile(raw_path, dtype='uint16')
+ # Initialize the image with the actual read dimensions
+ formatImage = np.zeros((height, width, bands))
+
+ for row in range(height):
+ for dim in range(bands):
+ formatImage[row, :, dim] = raw_image[(dim + row * bands) * width:(dim + 1 + row * bands) * width]
+
+ # Ensure the image is 30x30x224 by cropping or padding
+ target_height, target_width, target_bands = 30, 30, 224
+ # Crop or pad height
+ if height > target_height:
+ formatImage = formatImage[:target_height, :, :]
+ elif height < target_height:
+ pad_height = target_height - height
+ formatImage = np.pad(formatImage, ((0, pad_height), (0, 0), (0, 0)), mode='constant', constant_values=0)
+
+ # Crop or pad width
+ if width > target_width:
+ formatImage = formatImage[:, :target_width, :]
+ elif width < target_width:
+ pad_width = target_width - width
+ formatImage = np.pad(formatImage, ((0, 0), (0, pad_width), (0, 0)), mode='constant', constant_values=0)
+
+ # Crop or pad bands if necessary (usually bands should not change)
+ if bands > target_bands:
+ formatImage = formatImage[:, :, :target_bands]
+ elif bands < target_bands:
+ pad_bands = target_bands - bands
+ formatImage = np.pad(formatImage, ((0, 0), (0, 0), (0, pad_bands)), mode='constant', constant_values=0)
+
+ return formatImage
+
+
+# Specify the directory containing the HDR and RAW files
+directory = '/Users/xs/PycharmProjects/super-tomato/baixiangguo/光谱数据3030/'
+
+# Initialize a list to hold all the spectral data arrays
+all_spectral_data = []
+
+# Loop through each data set (assuming there are 40 datasets)
+for i in range(1, 101):
+ hdr_path = os.path.join(directory, f'{i}.HDR')
+ raw_path = os.path.join(directory, f'{i}')
+
+ # Read data
+ spectral_data = read_spectral_data(hdr_path, raw_path)
+ all_spectral_data.append(spectral_data)
+
+# Stack all data into a single numpy array
+all_spectral_data = np.stack(all_spectral_data)
+print(all_spectral_data.shape) # This should print (40, 30, 30, 224)
\ No newline at end of file
diff --git a/spectrum/02picture.ipynb b/spectrum/02picture.ipynb
index 403122c..a363289 100644
--- a/spectrum/02picture.ipynb
+++ b/spectrum/02picture.ipynb
@@ -11,7 +11,6 @@
"start_time": "2024-03-18T12:58:35.489144Z"
}
},
- "outputs": [],
"source": [
"import numpy as np\n",
"import cv2\n",
@@ -19,73 +18,12 @@
"import numpy as np\n",
"import cv2 as cv\n",
"import os"
- ]
+ ],
+ "outputs": []
},
{
"cell_type": "code",
"execution_count": 4,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\n",
- "\n",
- "(39911424,)\n",
- "(87, 2048, 224)\n",
- "\n",
- "[[[1686. 1654. 1654. ... 1654. 1622. 1654.]\n",
- " [1689. 1673. 1673. ... 1689. 1689. 1673.]\n",
- " [1673. 1657. 1657. ... 1673. 1753. 1609.]\n",
- " ...\n",
- " [1609. 1689. 1721. ... 1657. 1705. 1577.]\n",
- " [1718. 1702. 1654. ... 1574. 1638. 1686.]\n",
- " [1686. 1670. 1686. ... 1590. 1686. 1670.]]\n",
- "\n",
- " [[1654. 1670. 1718. ... 1686. 1654. 1734.]\n",
- " [1721. 1657. 1641. ... 1689. 1657. 1721.]\n",
- " [1641. 1625. 1705. ... 1705. 1689. 1609.]\n",
- " ...\n",
- " [1625. 1673. 1689. ... 1673. 1673. 1641.]\n",
- " [1686. 1622. 1654. ... 1686. 1654. 1606.]\n",
- " [1734. 1654. 1670. ... 1510. 1654. 1654.]]\n",
- "\n",
- " [[1718. 1702. 1670. ... 1622. 1670. 1686.]\n",
- " [1657. 1641. 1641. ... 1705. 1689. 1657.]\n",
- " [1673. 1673. 1689. ... 1673. 1625. 1657.]\n",
- " ...\n",
- " [1625. 1673. 1705. ... 1625. 1609. 1625.]\n",
- " [1702. 1686. 1654. ... 1638. 1670. 1654.]\n",
- " [1638. 1702. 1686. ... 1670. 1702. 1638.]]\n",
- "\n",
- " ...\n",
- "\n",
- " [[1638. 1606. 1686. ... 1654. 1670. 1638.]\n",
- " [1721. 1673. 1673. ... 1689. 1641. 1625.]\n",
- " [1641. 1641. 1673. ... 1657. 1641. 1625.]\n",
- " ...\n",
- " [1625. 1609. 1689. ... 1657. 1657. 1673.]\n",
- " [1638. 1606. 1702. ... 1622. 1622. 1654.]\n",
- " [1574. 1654. 1622. ... 1718. 1670. 1622.]]\n",
- "\n",
- " [[1590. 1686. 1638. ... 1654. 1654. 1638.]\n",
- " [1641. 1657. 1609. ... 1673. 1657. 1641.]\n",
- " [1721. 1657. 1641. ... 1657. 1673. 1577.]\n",
- " ...\n",
- " [1657. 1673. 1641. ... 1593. 1609. 1609.]\n",
- " [1622. 1670. 1670. ... 1686. 1734. 1622.]\n",
- " [1670. 1590. 1670. ... 1638. 1590. 1638.]]\n",
- "\n",
- " [[1654. 1654. 1638. ... 1606. 1606. 1558.]\n",
- " [1689. 1657. 1689. ... 1657. 1625. 1673.]\n",
- " [1657. 1561. 1657. ... 1657. 1673. 1609.]\n",
- " ...\n",
- " [1657. 1625. 1689. ... 1657. 1609. 1625.]\n",
- " [1638. 1654. 1654. ... 1622. 1606. 1590.]\n",
- " [1590. 1686. 1606. ... 1574. 1686. 1686.]]]\n"
- ]
- }
- ],
"source": [
"##合成真彩色图像\n",
"#读取raw文件\n",
@@ -126,21 +64,11 @@
"start_time": "2024-03-18T13:06:04.869067Z"
}
},
- "id": "3443037608cc60f6"
+ "id": "3443037608cc60f6",
+ "outputs": []
},
{
"cell_type": "code",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "\n",
- "\n",
- "(50462720,)\n"
- ]
- }
- ],
"source": [
"##合成真彩色图像\n",
"#读取raw文件\n",
@@ -192,97 +120,12 @@
}
},
"id": "283f370b2401221b",
- "execution_count": 5
+ "execution_count": 5,
+ "outputs": []
},
{
"cell_type": "code",
"execution_count": 5,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "(928, 1200, 3)\n",
- "\n",
- "(848, 1200, 3)\n",
- "\n",
- "(902, 1200, 3)\n",
- "\n",
- "(795, 1200, 3)\n",
- "\n",
- "(783, 1200, 3)\n",
- "\n",
- "(708, 1200, 3)\n",
- "\n",
- "(747, 1200, 3)\n",
- "\n",
- "(630, 1200, 3)\n",
- "\n",
- "(709, 1200, 3)\n",
- "\n",
- "(699, 1200, 3)\n",
- "\n",
- "(796, 1200, 3)\n",
- "\n",
- "(865, 1200, 3)\n",
- "\n",
- "(791, 1200, 3)\n",
- "\n",
- "(723, 1200, 3)\n",
- "\n",
- "(797, 1200, 3)\n",
- "\n",
- "(760, 1200, 3)\n",
- "\n",
- "(701, 1200, 3)\n",
- "\n",
- "(770, 1200, 3)\n",
- "\n",
- "(637, 1200, 3)\n",
- "\n",
- "(729, 1200, 3)\n",
- "\n",
- "(762, 1200, 3)\n",
- "\n",
- "(732, 1200, 3)\n",
- "\n",
- "(839, 1200, 3)\n",
- "\n",
- "(760, 1200, 3)\n",
- "\n",
- "(711, 1200, 3)\n",
- "\n",
- "(736, 1200, 3)\n",
- "\n",
- "(758, 1200, 3)\n",
- "\n",
- "(772, 1200, 3)\n",
- "\n",
- "(744, 1200, 3)\n",
- "\n",
- "(775, 1200, 3)\n",
- "\n",
- "(821, 1200, 3)\n",
- "\n",
- "(775, 1200, 3)\n",
- "\n",
- "(820, 1200, 3)\n",
- "\n",
- "(772, 1200, 3)\n",
- "\n",
- "(772, 1200, 3)\n",
- "\n",
- "(747, 1200, 3)\n",
- "\n",
- "(770, 1200, 3)\n",
- "\n",
- "(645, 1200, 3)\n",
- "\n",
- "(756, 1200, 3)\n",
- "\n"
- ]
- }
- ],
"source": [
"##循环合成真彩色图像\n",
"# 指定文件夹路径\n",
@@ -357,27 +200,28 @@
"start_time": "2023-11-24T02:50:24.958389400Z"
}
},
- "id": "15a3889f7bf1917f"
+ "id": "15a3889f7bf1917f",
+ "outputs": []
},
{
"cell_type": "code",
"execution_count": null,
- "outputs": [],
"source": [],
"metadata": {
"collapsed": false
},
- "id": "17b929b3de3fa2ed"
+ "id": "17b929b3de3fa2ed",
+ "outputs": []
},
{
"cell_type": "code",
"execution_count": null,
- "outputs": [],
"source": [],
"metadata": {
"collapsed": false
},
- "id": "e00c8e929ee57b60"
+ "id": "e00c8e929ee57b60",
+ "outputs": []
}
],
"metadata": {
diff --git a/spectrum/03mask.ipynb b/spectrum/03mask.ipynb
index 356f917..1480e8a 100644
--- a/spectrum/03mask.ipynb
+++ b/spectrum/03mask.ipynb
@@ -11,26 +11,16 @@
"start_time": "2024-03-18T07:45:52.061770Z"
}
},
- "outputs": [],
"source": [
"import cv2\n",
"import numpy as np\n",
"import os"
- ]
+ ],
+ "outputs": []
},
{
"cell_type": "code",
"execution_count": 44,
- "outputs": [
- {
- "data": {
- "text/plain": "True"
- },
- "execution_count": 44,
- "metadata": {},
- "output_type": "execute_result"
- }
- ],
"source": [
"#读取图片\n",
"img = cv2.imread('datas/39.tiff')\n",
@@ -49,21 +39,12 @@
"start_time": "2023-11-20T12:33:25.353136100Z"
}
},
- "id": "eba7a5b467780310"
+ "id": "eba7a5b467780310",
+ "outputs": []
},
{
"cell_type": "code",
"execution_count": 56,
- "outputs": [
- {
- "data": {
- "text/plain": "",
- "image/png": "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enV7TBMAAHRA7RqE1qxZo2effVZXXnll1PoHHnhAb731lpYuXaoVK1Zo165duuWWW7zxY8eOKScnR0eOHNGqVav04osv6oUXXtCsWbO8mm3btiknJ0c//OEPVVtbq2nTpunuu+/We++959UsXrxYRUVFmj17ttatW6cRI0YoOztbu3fvbs9pAwCAjsLayf79++2SSy6xiooK+/73v29Tp041M7OGhgbr1q2bLV261Kv95JNPTJJVVVWZmdnbb79t8fHxFgwGvZqFCxea3++3xsZGMzN76KGHbNiwYVH7HD9+vGVnZ3uPR48ebYWFhd7jY8eOWWpqqpWUlJzRHEKhkEmyUCjUusmfobTiMksrLmuXbQMAYoff77HVmvfvdjsjVFhYqJycHGVlZUWtr6mpUVNTU9T6oUOHatCgQaqqqpIkVVVVafjw4UpJSfFqsrOzFQ6HtXnzZq/mxG1nZ2d72zhy5IhqamqiauLj45WVleXVnKixsVHhcDhqAQAAnVfX9tjoq6++qnXr1mnNmjUtxoLBoBISEpScnBy1PiUlRcFg0Ks5PgQ1jzePnaomHA7r66+/1r59+3Ts2LGT1nz66acn7bukpEQPP/zwmU8UAAB0aG1+RmjHjh2aOnWqXn75ZSUmJrb15tvVjBkzFAqFvGXHjh2xbgkAALSjNg9CNTU12r17t6655hp17dpVXbt21YoVKzR//nx17dpVKSkpOnLkiBoaGqKeV19fr0AgIEkKBAIt7iJrfny6Gr/fr+7du6tfv37q0qXLSWuat3Ein88nv98ftQAAgM6rzYPQmDFjtHHjRtXW1nrLqFGjlJ+f7/27W7duqqys9J5TV1en7du3KzMzU5KUmZmpjRs3Rt3dVVFRIb/fr8svv9yrOX4bzTXN20hISNDIkSOjaiKRiCorK70aAADgtja/RqhXr1664oorotb16NFDffv29dYXFBSoqKhIffr0kd/v1/3336/MzEx973vfkySNHTtWl19+uX7605+qtLRUwWBQv/jFL1RYWCifzydJuvfee/X000/roYce0l133aVly5ZpyZIlKi8v9/ZbVFSkCRMmaNSoURo9erR++9vf6uDBg5o4cWJbTxsAAHRA7XKx9Ok88cQTio+P16233qrGxkZlZ2frmWee8ca7dOmisrIy3XfffcrMzFSPHj00YcIEPfLII15Nenq6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rVu3TiNGjFB2drZ2794d69ba1IoVK1RYWKg///nPqqioUFNTk8aOHauDBw9G1U2aNElfffWVt5SWlsao47YzbNiwqDl9+OGH3tgDDzygt956S0uXLtWKFSu0a9cu3XLLLTHstu2sWbMmat4VFRWSpJ/85CdeTWc53gcPHtSIESO0YMGCk46XlpZq/vz5WrRokaqrq9WjRw9lZ2fr8OHDXk1+fr42b96siooKlZWVaeXKlZo8efLZmsI3cqp5Hzp0SOvWrdPMmTO1bt06/elPf1JdXZ1+9KMftah95JFHol4H999//9lo/1s53TGXpHHjxkXN65VXXoka74jHXDr93I+f81dffaU//OEPiouL06233hpVd84e9zb5dlOcsdGjR1thYaH3+NixY5aammolJSUx7Kr97d692yTZihUrvHXf//73berUqbFrqh3Mnj3bRowYcdKxhoYG69atmy1dutRb98knn5gkq6qqOksdnj1Tp061iy66yCKRiJl1zuNtZibJXnvtNe9xJBKxQCBg8+bN89Y1NDSYz+ezV155xczMtmzZYpJszZo1Xs0777xjcXFxtnPnzrPW+7dx4rxPZvXq1SbJvvzyS29dWlqaPfHEE+3bXDs72dwnTJhgN9988999Tmc45mZndtxvvvlm+8d//MeodefyceeM0Fl05MgR1dTUKCsry1sXHx+vrKwsVVVVxbCz9hcKhSRJffr0iVr/8ssvq1+/frriiis0Y8YMHTp0KBbttamtW7cqNTVVF154ofLz87V9+3ZJUk1NjZqamqKO/9ChQzVo0KBOd/yPHDmil156SXfddVfUFxZ3xuN9om3btikYDEYd56SkJGVkZHjHuaqqSsnJyRo1apRXk5WVpfj4eFVXV5/1nttLKBRSXFxci+9snDt3rvr27aurr75a8+bN09GjR2PTYBv74IMP1L9/fw0ZMkT33Xef9uzZ4425cszr6+tVXl6ugoKCFmPn6nHv9H9Z+lzyf//3fzp27FiLv2qdkpKiTz/9NEZdtb9IJKJp06bp2muv1RVXXOGtv+OOO5SWlqbU1FRt2LBBxcXFqqur05/+9KcYdvvtZGRk6IUXXtCQIUP01Vdf6eGHH9b111+vTZs2KRgMKiEhocWbQkpKioLBYGwabievv/66Ghoa9LOf/cxb1xmP98k0H8uT/Zw3jwWDQfXv3z9qvGvXrurTp0+neS0cPnxYxcXFysvLi/oCzp///Oe65ppr1KdPH61atUozZszQV199pccffzyG3X5748aN0y233KL09HR9/vnn+vd//3fdeOONqqqqUpcuXZw45pL04osvqlevXi0+8j+XjztBCO2usLBQmzZtirpWRlLUZ+PDhw/XgAEDNGbMGH3++ee66KKLznabbeLGG2/0/n3llVcqIyNDaWlpWrJkibp37x7Dzs6u3//+97rxxhuVmprqreuMxxsn19TUpNtuu01mpoULF0aNFRUVef++8sorlZCQoHvuuUclJSUd7qsZjnf77bd7/x4+fLiuvPJKXXTRRfrggw80ZsyYGHZ2dv3hD39Qfn6+EhMTo9afy8edj8bOon79+qlLly4t7hKqr69XIBCIUVfta8qUKSorK9Py5ct1wQUXnLI2IyNDkvTZZ5+djdbOiuTkZF166aX67LPPFAgEdOTIETU0NETVdLbj/+WXX+r999/X3Xfffcq6zni8JXnH8lQ/54FAoMUNEkePHtXevXs7/GuhOQR9+eWXqqioiDobdDIZGRk6evSovvjii7PT4Fly4YUXql+/ft7ruzMf82b//d//rbq6utP+7Evn1nEnCJ1FCQkJGjlypCorK711kUhElZWVyszMjGFnbc/MNGXKFL322mtatmyZ0tPTT/uc2tpaSdKAAQPaubuz58CBA/r88881YMAAjRw5Ut26dYs6/nV1ddq+fXunOv7PP/+8+vfvr5ycnFPWdcbjLUnp6ekKBAJRxzkcDqu6uto7zpmZmWpoaFBNTY1Xs2zZMkUiES8gdkTNIWjr1q16//331bdv39M+p7a2VvHx8S0+Nuro/vd//1d79uzxXt+d9Zgf7/e//71GjhypESNGnLb2nDrusb5a2zWvvvqq+Xw+e+GFF2zLli02efJkS05OtmAwGOvW2tR9991nSUlJ9sEHH9hXX33lLYcOHTIzs88++8weeeQRW7t2rW3bts3eeOMNu/DCC+2GG26Iceffzr/+67/aBx98YNu2bbOPPvrIsrKyrF+/frZ7924zM7v33ntt0KBBtmzZMlu7dq1lZmZaZmZmjLtuO8eOHbNBgwZZcXFx1PrOdrz3799v69evt/Xr15ske/zxx239+vXe3VFz58615ORke+ONN2zDhg128803W3p6un399dfeNsaNG2dXX321VVdX24cffmiXXHKJ5eXlxWpKZ+RU8z5y5Ij96Ec/sgsuuMBqa2ujfu4bGxvNzGzVqlX2xBNPWG1trX3++ef20ksv2Xe+8x278847Yzyz0zvV3Pfv32//9m//ZlVVVbZt2zZ7//337ZprrrFLLrnEDh8+7G2jIx5zs9O/3s3MQqGQnXfeebZw4cIWzz/XjztBKAaeeuopGzRokCUkJNjo0aPtz3/+c6xbanOSTro8//zzZma2fft2u+GGG6xPnz7m8/ns4osvtgcffNBCoVBsG/+Wxo8fbwMGDLCEhAQ7//zzbfz48fbZZ595419//bX9y7/8i/Xu3dvOO+88+/GPf2xfffVVDDtuW++9955Jsrq6uqj1ne14L1++/KSv7wkTJpjZ326hnzlzpqWkpJjP57MxY8a0+G+yZ88ey8vLs549e5rf77eJEyfa/v37YzCbM3eqeW/btu3v/twvX77czMxqamosIyPDkpKSLDEx0S677DL71a9+FRUWzlWnmvuhQ4ds7Nix9p3vfMe6detmaWlpNmnSpBb/g9sRj7nZ6V/vZmbPPvusde/e3RoaGlo8/1w/7nFmZu16ygkAAOAcxTVCAADAWQQhAADgLIIQAABwFkEIAAA4iyAEAACcRRACAADOIggBAABnEYQAAICzCEIAAMBZBCEAAOAsghAAAHAWQQgAADjr/wEFpSgz/dh0eQAAAABJRU5ErkJggg=="
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
"source": [
"import cv2\n",
"import numpy as np\n",
@@ -86,20 +67,11 @@
"start_time": "2024-03-18T08:31:54.363728Z"
}
},
- "id": "14abba9e7d1d9496"
+ "id": "14abba9e7d1d9496",
+ "outputs": []
},
{
"cell_type": "code",
- "outputs": [
- {
- "data": {
- "text/plain": "",
- "image/png": "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"
- },
- "metadata": {},
- "output_type": "display_data"
- }
- ],
"source": [
"#亮度增强\n",
"from PIL import Image, ImageEnhance\n",
@@ -128,12 +100,12 @@
}
},
"id": "4bde773e19fd521e",
- "execution_count": 77
+ "execution_count": 77,
+ "outputs": []
},
{
"cell_type": "code",
"execution_count": 78,
- "outputs": [],
"source": [
"import cv2\n",
"import numpy as np\n",
@@ -188,11 +160,11 @@
"start_time": "2024-03-18T15:43:19.273376Z"
}
},
- "id": "a6e663957af72d33"
+ "id": "a6e663957af72d33",
+ "outputs": []
},
{
"cell_type": "code",
- "outputs": [],
"source": [],
"metadata": {
"collapsed": false,
@@ -202,11 +174,11 @@
}
},
"id": "7264359547e5d56f",
- "execution_count": 25
+ "execution_count": 25,
+ "outputs": []
},
{
"cell_type": "code",
- "outputs": [],
"source": [
"#白色颜色带处理\n",
"\n",
@@ -250,184 +222,11 @@
}
},
"id": "9eedb7f708e43473",
- "execution_count": 95
+ "execution_count": 95,
+ "outputs": []
},
{
"cell_type": "code",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n",
- "H: (0, 179), S: (0, 255), V: (0, 255)\n"
- ]
- },
- {
- "ename": "error",
- "evalue": "OpenCV(4.9.0) D:\\a\\opencv-python\\opencv-python\\opencv\\modules\\highgui\\src\\window_w32.cpp:2561: error: (-27:Null pointer) NULL window: 'HSV Thresholding' in function 'cvGetTrackbarPos'\n",
- "output_type": "error",
- "traceback": [
- "\u001B[1;31m---------------------------------------------------------------------------\u001B[0m",
- "\u001B[1;31merror\u001B[0m Traceback (most recent call last)",
- "Cell \u001B[1;32mIn[70], line 28\u001B[0m\n\u001B[0;32m 24\u001B[0m hsv \u001B[38;5;241m=\u001B[39m cv2\u001B[38;5;241m.\u001B[39mcvtColor(image, cv2\u001B[38;5;241m.\u001B[39mCOLOR_BGR2HSV)\n\u001B[0;32m 26\u001B[0m \u001B[38;5;28;01mwhile\u001B[39;00m \u001B[38;5;28;01mTrue\u001B[39;00m:\n\u001B[0;32m 27\u001B[0m \u001B[38;5;66;03m# 获取滑动条的当前位置\u001B[39;00m\n\u001B[1;32m---> 28\u001B[0m h_lower \u001B[38;5;241m=\u001B[39m \u001B[43mcv2\u001B[49m\u001B[38;5;241;43m.\u001B[39;49m\u001B[43mgetTrackbarPos\u001B[49m\u001B[43m(\u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mH Lower\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m,\u001B[49m\u001B[43m \u001B[49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[38;5;124;43mHSV Thresholding\u001B[39;49m\u001B[38;5;124;43m'\u001B[39;49m\u001B[43m)\u001B[49m\n\u001B[0;32m 29\u001B[0m h_upper \u001B[38;5;241m=\u001B[39m cv2\u001B[38;5;241m.\u001B[39mgetTrackbarPos(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mH Upper\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mHSV Thresholding\u001B[39m\u001B[38;5;124m'\u001B[39m)\n\u001B[0;32m 30\u001B[0m s_lower \u001B[38;5;241m=\u001B[39m cv2\u001B[38;5;241m.\u001B[39mgetTrackbarPos(\u001B[38;5;124m'\u001B[39m\u001B[38;5;124mS Lower\u001B[39m\u001B[38;5;124m'\u001B[39m, \u001B[38;5;124m'\u001B[39m\u001B[38;5;124mHSV Thresholding\u001B[39m\u001B[38;5;124m'\u001B[39m)\n",
- "\u001B[1;31merror\u001B[0m: OpenCV(4.9.0) D:\\a\\opencv-python\\opencv-python\\opencv\\modules\\highgui\\src\\window_w32.cpp:2561: error: (-27:Null pointer) NULL window: 'HSV Thresholding' in function 'cvGetTrackbarPos'\n"
- ]
- }
- ],
"source": [
"#实现利用hsv空间进行阈值分割,要求hsv三个值做成滑动轴可拖动的实时显示当前阈值分割效果,并且显示当前hsv三个的具体值,\n",
"\n",
@@ -492,12 +291,12 @@
}
},
"id": "a42269b65f848794",
- "execution_count": 70
+ "execution_count": 70,
+ "outputs": []
},
{
"cell_type": "code",
"execution_count": 28,
- "outputs": [],
"source": [
"##循环提取mask\n",
"\n",
@@ -548,20 +347,12 @@
"start_time": "2024-03-18T08:14:58.534491Z"
}
},
- "id": "3665c0b573adb358"
+ "id": "3665c0b573adb358",
+ "outputs": []
},
{
"cell_type": "code",
"execution_count": 57,
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "处理完成,掩膜图像已保存到指定文件夹。\n"
- ]
- }
- ],
"source": [
" #先增强图像亮度,然后循环提取并保存mask(20240318版无锡透射百香果)ps:目前参数适用于old文件夹内图像,new文件夹内图像需要调整参数\n",
"\n",
@@ -650,19 +441,11 @@
"start_time": "2024-03-18T12:15:14.164074Z"
}
},
- "id": "ab7f303dfa7d8a27"
+ "id": "ab7f303dfa7d8a27",
+ "outputs": []
},
{
"cell_type": "code",
- "outputs": [
- {
- "name": "stdout",
- "output_type": "stream",
- "text": [
- "处理完成,掩膜图像已保存到指定文件夹。\n"
- ]
- }
- ],
"source": [
" #先增强图像亮度,然后循环提取并保存mask(20240318版无锡透射百香果)ps:new文件夹内\n",
"\n",
@@ -753,16 +536,18 @@
}
},
"id": "6afa206f04690497",
- "execution_count": 101
+ "execution_count": 101,
+ "outputs": []
},
{
"cell_type": "code",
- "outputs": [],
"source": [],
"metadata": {
"collapsed": false
},
- "id": "bc021fb45388a2b3"
+ "id": "bc021fb45388a2b3",
+ "execution_count": null,
+ "outputs": []
}
],
"metadata": {