겹친 직사각형의 화집합 부분의 면적을 구한다

12256 단어 파이썬OpenCV

Overview





이런 느낌으로, 무작위로 겹친 구형의, 화집합 부분의 면적을 요구하고 싶을 때라도 있는 것이 아닐까요.

자 최근 유행의 이런 건가.
(이미지는 여기에서 배차 : htps : //에서. 응 kmk. 메/py 텐-오펜 cv-후세세에서 c 치온-아 r인가 s인지로/)


이것, 보조선 당겨 손 계산하는 분에는 기합으로 어떻게든 할 수 있습니다만, 제대로 계산하면 꽤 힘들다고 할까
https://mathcommunication.hatenablog.com/entry/2016/10/11/003213#%E5%B9%B3%E9%9D%A2%E5%9B%B3%E5%BD%A2%E3%81%AB %E5%AF%BE%E3%81%99%E3%82%8B%E5%8F%AF%E6%B8%AC%E6%80%A7%E3%81%A8%E9%9D%A2%E7 %A9%8D

NP 어려움? 어쩐지 범인에게는 무리이므로,

정책



직접 그려 픽셀을 계산합니다.

계산식으로 산출하는 경우처럼 깨끗한 값은 되지 않고, 해상도로 오차도 나오지만,
그것이 문제가 되는 케이스는 아마 별로 없잖아.

구체적으로는

이진화하여





검정(채우기 색)의 픽셀을 세는



opencv 에 countNonZero 라고 말하는 정확히 그것의 함수가 있으므로, 이것을 사용한다.
htps : // / cs. 오펜 cv. rg / 2.4 / 모즈 ぇ s / 이것 / 드 c / 오페라 치온 s_ 온_ 아라 ys. html

코드



그럼 갑니다.

requirements.txt
cycler==0.10.0
kiwisolver==1.2.0
matplotlib==3.2.1
numpy==1.18.4
opencv-python==4.2.0.34
Pillow==7.1.2
pyparsing==2.4.7
python-dateutil==2.8.1
six==1.14.0

무작위이므로 실행할 때마다 직사각형의 위치와 크기가 바뀝니다.

a.py
from PIL import Image, ImageDraw
import numpy as np
import cv2

import random
import matplotlib


rects = [
    (random.randrange(200),
        random.randrange(200),
        random.randrange(50, 120),
        random.randrange(50, 120)
    ) for x in range(20)
]

colors = random.sample(matplotlib.colors.cnames.keys(), len(rects))

# 線画用
im1 = Image.new('RGB', (200, 200), (255, 255, 255))
d1 = ImageDraw.Draw(im1)
# 二値変換確認用
im2 = Image.new('RGB', (200, 200), (255, 255, 255))
d2 = ImageDraw.Draw(im2)

# 矩形描画
for r, c in zip(rects, colors):
    print(c, r)
    d1.rectangle(r, outline=c)
    d2.rectangle(r, fill=(0, 0, 0))

im1.save("a1.png")
im2.save("a2.png")

# 二値変換
nim = np.array(im2, dtype=np.uint8)
gim = cv2.cvtColor(nim, cv2.COLOR_RGB2GRAY)
ret, bwim = cv2.threshold(gim, 0, 255, cv2.THRESH_OTSU)

# 二値変換後の画像
cv2.imwrite("b1.png", bwim)

whitePixels = cv2.countNonZero(bwim)
blackPixels = bwim.size - whitePixels

print("-"*50)
print(whitePixels, blackPixels, bwim.size)
print("filled area rate:", blackPixels / bwim.size)

실행



bash
$ python a.py
gainsboro (188, 158, 61, 63)
palegreen (174, 182, 118, 53)
chartreuse (75, 34, 82, 81)
olive (170, 10, 93, 111)
mistyrose (183, 65, 78, 52)
indianred (25, 55, 51, 109)
mediumaquamarine (102, 155, 59, 89)
navy (169, 127, 85, 96)
darkviolet (103, 152, 76, 51)
yellowgreen (84, 6, 73, 118)
deeppink (42, 61, 95, 90)
bisque (47, 101, 107, 105)
dimgrey (95, 179, 91, 70)
maroon (146, 182, 88, 62)
whitesmoke (189, 118, 83, 112)
lavender (71, 149, 104, 117)
burlywood (36, 82, 105, 82)
darkslategrey (122, 128, 103, 52)
mediumslateblue (163, 121, 84, 92)
silver (144, 126, 61, 58)
--------------------------------------------------
18580 21420 40000
fill area rate: 0.5355

끝.

참고



htps : //에서. 응 kmk. 메 / py 텐 - 핏 w
https://techtech-sorae.com/pythonopencv%E3%81%A7%E4%BA%8C%E5%80%A4%E7%94%BB%E5%83%8F%E3%81%8B%E3% 82%89%E7%99%BD%E3%81%A8%E9%BB%92%E3%81%AE%E9%9D%A2%E7%A9%8D%E6%AF%94%E3%82% 92%E7%AE%97%E5%87%BA/

좋은 웹페이지 즐겨찾기