겹친 직사각형의 화집합 부분의 면적을 구한다
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.txtcycler==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.pyfrom 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/
Reference
이 문제에 관하여(겹친 직사각형의 화집합 부분의 면적을 구한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/arc279/items/077e8a0f9cacbb2e99ea
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
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
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)
$ 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
Reference
이 문제에 관하여(겹친 직사각형의 화집합 부분의 면적을 구한다), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/arc279/items/077e8a0f9cacbb2e99ea텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)