{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "initial_id", "metadata": { "collapsed": true, "ExecuteTime": { "end_time": "2024-04-10T14:49:51.025756600Z", "start_time": "2024-04-10T14:49:51.021739700Z" } }, "source": [], "outputs": [] }, { "cell_type": "code", "source": [ " import cv2\n", " import numpy as np\n", " import matplotlib.pyplot as plt\n", " image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\TopImage_32.jpg')\n", " r_channel = image[:, :, 2]\n", " b_channel = image[:, :, 0]\n", " gray_image = r_channel - b_channel\n", " gray_image = np.clip(gray_image, 0, 255)\n", " gray_image = np.uint8(gray_image)\n", "\n", " # 显示新生成的灰度图像\n", " plt.imshow(gray_image, cmap='gray')\n", " plt.axis('off')\n", " plt.show()\n", " " ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-04-10T14:53:49.016762Z", "start_time": "2024-04-10T14:53:48.426912500Z" } }, "id": "206810a054630770", "execution_count": 3, "outputs": [] }, { "cell_type": "code", "source": [ "import cv2\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "\n", "# 读取RGB图像\n", "img = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\TopImage_32.jpg')\n", "\n", "\n", "# 获取图像的高度和宽度\n", "height, width, _ = img.shape\n", "\n", "# 创建一个新的灰度图像\n", "gray_img = np.zeros((height, width), dtype=np.uint8)\n", "\n", "# 遍历每个像素,计算R-B作为新的灰度值\n", "for y in range(height):\n", " for x in range(width):\n", " r, g, b = img[y, x]\n", " gray_value = r - b\n", " if gray_value < 0:\n", " gray_value = 0\n", " elif gray_value > 255:\n", " gray_value = 255\n", " gray_img[y, x] = int(gray_value)\n", "\n", "\n", "plt.imshow(gray_image, cmap='gray')\n", "plt.axis('off')\n", "plt.show()\n", " \n", "# 保存灰度图像\n", "# cv2.imwrite('output_image.jpg', gray_img)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-04-10T15:04:30.607530400Z", "start_time": "2024-04-10T15:03:55.344343200Z" } }, "id": "ba82f5c2fd049821", "execution_count": 9, "outputs": [] }, { "cell_type": "code", "source": [ "import torch\n", "import cv2\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "def extract_r_minus_b(image):\n", " img_tensor = torch.tensor(image, dtype=torch.float32).to('cuda')\n", "\n", " r_channel = img_tensor[:, :, 0]\n", " b_channel = img_tensor[:, :, 2]\n", "\n", " # 检查是否存在 NoneType 值,并将其替换为 0\n", " r_channel = torch.nan_to_num(r_channel, nan=0)\n", " b_channel = torch.nan_to_num(b_channel, nan=0)\n", "\n", " r_minus_b = torch.clamp(r_channel - b_channel, 0, 255).to('cpu').numpy().astype(np.uint8)\n", "\n", " return r_minus_b\n", "\n", "# 测试图像路径\n", "image_path = '20240410tomatoRGBtest2/data/39.bmp'\n", "\n", "# 读取图像\n", "image = cv2.imread(image_path)\n", "\n", "# 测试 extract_r_minus_b() 函数\n", "r_minus_b = extract_r_minus_b(image)\n", "\n", "# 显示结果\n", "plt.imshow(r_minus_b, cmap='gray')\n", "plt.title('R-B Channel Difference')\n", "plt.axis('off')\n", "plt.show()\n" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-04-10T16:01:24.857246200Z", "start_time": "2024-04-10T16:01:24.805385100Z" } }, "id": "7f09896cca12ec80", "execution_count": 15, "outputs": [] }, { "cell_type": "code", "source": [ "### 自适应阈值分割\n", "import cv2\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# 读取R通道减去B通道的灰度图\n", "gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n", "\n", "# 自适应阈值分割\n", "adaptive_threshold = cv2.adaptiveThreshold(gray_image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)\n", "\n", "# 显示结果\n", "plt.imshow(adaptive_threshold, cmap='gray')\n", "plt.axis('off')\n", "plt.show()\n" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-04-10T14:49:51.023762Z", "start_time": "2024-04-10T14:49:47.876441200Z" } }, "id": "b9a2db758d89860e", "execution_count": 1, "outputs": [] }, { "cell_type": "code", "source": [ "### 带滑动条调节的阈值分割\n", "\n", "import cv2\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "import ipywidgets as widgets\n", "from IPython.display import display\n", "\n", "# 读取R通道减去B通道的灰度图\n", "gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n", "\n", "# 定义回调函数\n", "def threshold_callback(threshold):\n", " _, thresholded_image = cv2.threshold(gray_image, threshold, 255, cv2.THRESH_BINARY)\n", " plt.imshow(thresholded_image, cmap='gray')\n", " plt.axis('off')\n", " plt.show()\n", "\n", "# 创建滑动条\n", "threshold_slider = widgets.IntSlider(min=0, max=255, step=1, value=128, description='Threshold:')\n", "display(threshold_slider)\n", "\n", "# 调用回调函数\n", "threshold_callback(threshold_slider.value)\n", "\n", "# 连接滑动条和回调函数\n", "widgets.interactive(threshold_callback, threshold=threshold_slider)\n" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-04-10T09:49:57.666748700Z", "start_time": "2024-04-10T09:49:56.140521900Z" } }, "id": "6ff8e4e22d034f53", "execution_count": 7, "outputs": [] }, { "cell_type": "code", "source": [ "### Otsu阈值分割\n", "import cv2\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# 读取R通道减去B通道的灰度图\n", "gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n", "\n", "# 使用Otsu阈值分割\n", "_, otsu_threshold = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)\n", "\n", "# 显示结果\n", "plt.imshow(otsu_threshold, cmap='gray')\n", "plt.axis('off')\n", "plt.show()\n" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-04-10T09:54:09.077152500Z", "start_time": "2024-04-10T09:54:08.502123300Z" } }, "id": "6207115686820296", "execution_count": 8, "outputs": [] }, { "cell_type": "code", "source": [ "### Sobel边缘检测\n", "import cv2\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# 读取R通道减去B通道的灰度图\n", "gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n", "\n", "# 使用Sobel边缘检测\n", "sobel_x = cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=5)\n", "sobel_y = cv2.Sobel(gray_image, cv2.CV_64F, 0, 1, ksize=5)\n", "edges = np.sqrt(sobel_x**2 + sobel_y**2)\n", "\n", "# 显示结果\n", "plt.imshow(edges, cmap='gray')\n", "plt.axis('off')\n", "plt.show()\n" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-04-10T09:55:13.525305800Z", "start_time": "2024-04-10T09:55:12.652295600Z" } }, "id": "f3bd38e5e62cbd3c", "execution_count": 9, "outputs": [] }, { "cell_type": "code", "source": [ "### 形态学处理\n", "import cv2\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# 读取R通道减去B通道的灰度图\n", "gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n", "\n", "# 定义结构元素\n", "kernel = np.ones((2,2),np.uint8)\n", "\n", "# 闭运算\n", "closing = cv2.morphologyEx(gray_image, cv2.MORPH_CLOSE, kernel)\n", "\n", "# 显示结果\n", "plt.imshow(closing, cmap='gray')\n", "plt.axis('off')\n", "plt.show()\n" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-04-10T09:57:05.878548800Z", "start_time": "2024-04-10T09:57:05.060591800Z" } }, "id": "7395629910ee8620", "execution_count": 11, "outputs": [] }, { "cell_type": "code", "source": [ "### 角点检测\n", "import cv2\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "# 读取R通道减去B通道的灰度图\n", "gray_image = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\data\\r-b.jpg', cv2.IMREAD_GRAYSCALE)\n", "\n", "# Shi-Tomasi角点检测\n", "corners = cv2.goodFeaturesToTrack(gray_image, 100, 0.01, 10)\n", "\n", "# 绘制角点\n", "corners = np.int0(corners)\n", "for i in corners:\n", " x, y = i.ravel()\n", " cv2.circle(gray_image, (x, y), 3, 255, -1)\n", "\n", "# 显示结果\n", "plt.imshow(gray_image, cmap='gray')\n", "plt.axis('off')\n", "plt.show()\n" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-04-10T09:59:32.789829500Z", "start_time": "2024-04-10T09:59:31.769444500Z" } }, "id": "990a0ecebe27d9a0", "execution_count": 12, "outputs": [] }, { "cell_type": "code", "source": [ "### 二值化对象\n", "\n", "import cv2\n", "import numpy as np\n", "\n", "# 读取原始图像\n", "img = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\output\\r_minus_b_26.jpg', cv2.IMREAD_GRAYSCALE)\n", "\n", "# 使用Otsu's二值化方法\n", "_, binary_img = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)\n", "\n", "# # 显示二值化后的图像\n", "# cv2.imshow('Binary Image', binary_img)\n", "# cv2.waitKey(0)\n", "# cv2.destroyAllWindows()\n", "# 保存二值化后的图像\n", "cv2.imwrite('06.jpg', binary_img)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-04-12T06:34:26.530387300Z", "start_time": "2024-04-12T06:34:26.132598800Z" } }, "id": "c4a6c0bfd05d3283", "execution_count": 1, "outputs": [] }, { "cell_type": "code", "source": [ "### 光滑边缘\n", "import cv2\n", "import numpy as np\n", "\n", "# 假设您的两张图像已经保存为 image1.png 和 image2.png\n", "image1 = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\06.jpg', cv2.IMREAD_GRAYSCALE)\n", "image2 = cv2.imread(r'D:\\project\\Tomato\\20240410tomatoRGBtest2\\010.png', cv2.IMREAD_GRAYSCALE)\n", "\n", "# 应用高斯模糊来平滑边缘\n", "smoothed_image1 = cv2.GaussianBlur(image1, (9, 9), 0)\n", "smoothed_image2 = cv2.GaussianBlur(image2, (9, 9), 0)\n", "\n", "# 将处理后的图像转换为二值图像\n", "_, binary_image1 = cv2.threshold(smoothed_image1, 128, 255, cv2.THRESH_BINARY)\n", "_, binary_image2 = cv2.threshold(smoothed_image2, 128, 255, cv2.THRESH_BINARY)\n", "\n", "# 保存二值化后的图像\n", "cv2.imwrite('smoothed_binary_image06.png', binary_image1)\n", "cv2.imwrite('smoothed_binary_image2.png', binary_image2)" ], "metadata": { "collapsed": false, "ExecuteTime": { "end_time": "2024-04-12T06:35:18.063684900Z", "start_time": "2024-04-12T06:35:17.935028900Z" } }, "id": "1f6ac60b3150fc9e", "execution_count": 3, "outputs": [] }, { "cell_type": "code", "source": [], "metadata": { "collapsed": false }, "id": "3749d97ac3719946", "execution_count": null, "outputs": [] } ], "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 }