layout-parser
layout-parser copied to clipboard
Intersect operation
The intersect operation always returns results, however, it is not true when two blocks are not overlapped.
Thanks for reporting. Yes, that's a bug - should be fix in the next update.
@lolipopshock By the way, I think the is_in operation is too strict. Would it be better to allow some flexibility? This is especially useful for some blocks which are either labelled as text or title.
@lolipopshock By the way, I think the
is_inoperation is too strict. Would it be better to allow some flexibility? This is especially useful for some blocks which are either labelled as text or title.
Does the soft_margin and center parameters in the is_in function help? (See in the documentation)
Thanks @lolipopshock for your prompt reply.
What you mention could be an instant solution. On the other hand, correct me if I am wrong, it requires to provide absolute value for soft_margin which is case-by-case. Would it better to use block intersection as a criterion? If block A is in block B, both of them shall intersect with each other. In other words, intersect_area/block_a_area shall be close to 1.
What you mention could be an instant solution. On the other hand, correct me if I am wrong, it requires to provide absolute value for
soft_marginwhich is case-by-case. Would it better to use block intersection as a criterion? If block A is in block B, both of them shall intersect with each other. In other words,intersect_area/block_a_areashall be close to 1.
Ahh if you set center=True, then if block A's center is within block B's boundary, then block_A.is_in(block_B, center=True) ==True. For example,
import layoutparser as lp
import numpy as np
block_A = lp.Rectangle(50, 50, 150, 150)
block_B = lp.Rectangle(40, 60, 160, 130)
lp.draw_box(np.ones((200,200,3), dtype='uint8')*255, [block_A, block_B])
assert block_A.is_in(block_B) == False
assert block_A.is_in(block_B, center=True) == True

Thanks, it works.
Sorry, there is still exception even though setting center=True. In your example, when block_A contains block_B, block_A.is_in(block_B, center=True) is true. Then is_in is a little bit confused.
You may be also interested in this example:
block_A = lp.Rectangle(40, 50, 150, 150) block_B = lp.Rectangle(40, 120, 140, 151)
You may be also interested in this example:
block_A = lp.Rectangle(40, 50, 150, 150) block_B = lp.Rectangle(40, 120, 140, 151)
Good point. In this case, you might want to use soft_margin:
block_A = lp.Rectangle(40, 50, 150, 150)
block_B = lp.Rectangle(40, 120, 140, 151)
assert block_B.is_in(block_A, soft_margin={'bottom':5})
assert block_B.is_in(block_A, soft_margin={'bottom':1}) # this also works