Python 实现图像处理:提取边界、计算面积和周长
import\u0020cv2\nimport\u0020numpy\u0020as\u0020np\nimport\u0020matplotlib.pyplot\u0020as\u0020plt\n\npic\u0020=\u0020cv2.imread('yaogan1.bmp',\u00200)\nrow,\u0020column\u0020=\u0020pic.shape\n\nthreshold,\u0020binary_img\u0020=\u0020cv2.threshold(pic,\u00200,\u0020255,\u0020cv2.THRESH_BINARY\u0020+\u0020cv2.THRESH_OTSU)\nresult_expand\u0020=\u0020cv2.dilate(binary_img,\u0020np.ones((3,\u00203),\u0020np.uint8),\u0020iterations=1)\n\nfor\u0020i\u0020in\u0020range(int(row/3),\u0020row):\n\u0020\u0020result_expand[i,\u00200]\u0020=\u0020255\n\nfill_hole\u0020=\u0020cv2.fillHoles(result_expand)\n\nfill_hole\u0020=\u0020cv2.morphologyEx(fill_hole,\u0020cv2.MORPH_OPEN,\u0020np.ones((3,\u00203),\u0020np.uint8),\u0020iterations=1)\n\nplt.figure(figsize=(10,\u002010))\nplt.subplot(2,\u00202,\u00201)\nplt.imshow(pic,\u0020cmap='gray')\nplt.title('原图')\nplt.subplot(2,\u00202,\u00202)\nplt.imshow(binary_img,\u0020cmap='gray')\nplt.title('二值化')\nplt.subplot(2,\u00202,\u00203)\nplt.imshow(result_expand,\u0020cmap='gray')\nplt.title('膨胀')\nplt.subplot(2,\u00202,\u00204)\nplt.imshow(fill_hole,\u0020cmap='gray')\nplt.title('孔洞填充')\n\nimg_edge\u0020=\u0020cv2.Sobel(fill_hole,\u0020cv2.CV_8U,\u00201,\u00201,\u0020ksize=3)\ncontours,\u0020_\u0020=\u0020cv2.findContours(fill_hole,\u0020cv2.RETR_EXTERNAL,\u0020cv2.CHAIN_APPROX_SIMPLE)\n\nplt.figure(figsize=(10,\u002010))\nplt.subplot(2,\u00202,\u00201)\nplt.imshow(img_edge,\u0020cmap='gray')\nplt.title('sobel算子边缘检测')\nplt.subplot(2,\u00202,\u00202)\nplt.imshow(cv2.cvtColor(pic,\u0020cv2.COLOR_GRAY2RGB))\nplt.title('陆地面积')\nfor\u0020i,\u0020contour\u0020in\u0020enumerate(contours):\n\u0020\u0020area\u0020=\u0020cv2.contourArea(contour)\n\u0020\u0020centroid\u0020=\u0020np.mean(contour,\u0020axis=0,\u0020dtype=np.int32)[0]\n\u0020\u0020plt.text(centroid[0],\u0020centroid[1],\u0020f'{i+1}:\u0020面积={area}',\u0020color='b',\u0020fontsize=6)\n\u0020\u0020plt.plot(contour[:,\u00200,\u00200],\u0020contour[:,\u00200,\u00201],\u0020'b',\u0020linewidth=1)\nplt.subplot(2,\u00202,\u00203)\nplt.imshow(cv2.cvtColor(pic,\u0020cv2.COLOR_GRAY2RGB))\nplt.title('陆地边长')\nfor\u0020i,\u0020contour\u0020in\u0020enumerate(contours):\n\u0020\u0020perimeter\u0020=\u0020cv2.arcLength(contour,\u0020True)\n\u0020\u0020centroid\u0020=\u0020np.mean(contour,\u0020axis=0,\u0020dtype=np.int32)[0]\n\u0020\u0020plt.text(centroid[0],\u0020centroid[1],\u0020f'{i+1}:\u0020边长={perimeter}',\u0020color='b',\u0020fontsize=6)\n\u0020\u0020plt.plot(contour[:,\u00200,\u00200],\u0020contour[:,\u00200,\u00201],\u0020'b',\u0020linewidth=1)\nplt.subplot(2,\u00202,\u00204)\nplt.imshow(cv2.cvtColor(pic,\u0020cv2.COLOR_GRAY2RGB))\nplt.title('海洋')\ncontours,\u0020_\u0020=\u0020cv2.findContours(255\u0020-\u0020fill_hole,\u0020cv2.RETR_EXTERNAL,\u0020cv2.CHAIN_APPROX_SIMPLE)\nfor\u0020i,\u0020contour\u0020in\u0020enumerate(contours):\n\u0020\u0020area\u0020=\u0020cv2.contourArea(contour)\n\u0020\u0020perimeter\u0020=\u0020cv2.arcLength(contour,\u0020True)\n\u0020\u0020centroid\u0020=\u0020np.mean(contour,\u0020axis=0,\u0020dtype=np.int32)[0]\n\u0020\u0020plt.text(centroid[0],\u0020centroid[1],\u0020f'{i+1}:\u0020面积={area}\u0020\u0020边长={perimeter}',\u0020color='r',\u0020fontsize=10)\n\u0020\u0020plt.plot(contour[:,\u00200,\u00200],\u0020contour[:,\u00200,\u00201],\u0020'k',\u0020linewidth=1)\nplt.show()
原文地址: https://www.cveoy.top/t/topic/pRxP 著作权归作者所有。请勿转载和采集!