You can use clip path in both ways (on the top element or the bottom one) and simply make top and bottom to overlay like this :
.first,
.second {
display: inline-block;
margin: 5px;
}
.first .top {
clip-path: circle(72.9% at 50% 27%);
height: 200px;
width: 200px;
background: url(https://i.picsum.photos/id/10/800/800.jpg) center/cover;
position: relative;
}
.first .bottom {
margin-top: -70px;
background: yellow;
height: 100px;
width: 200px;
}
.second .top {
height: 200px;
width: 200px;
background:url(https://i.picsum.photos/id/10/800/800.jpg) center/cover;
position: relative;
}
.second .bottom {
clip-path: polygon(0 25%, 14% 41%, 28% 51%, 49% 54%, 66% 53%, 79% 48%, 89% 39%, 100% 27%, 100% 100%, 47% 100%, 0% 100%);
margin-top: -70px;
background: yellow;
height: 100px;
width: 200px;
}
<div class="first">
<div class="top">
</div>
<div class="bottom">
</div>
</div>
<div class="second">
<div class="top">
</div>
<div class="bottom">
</div>
</div>
Here is a useful link to generate path :
https://bennettfeely.com/clippy/
Here is another idea using radial-gradient
.first {
height: 200px;
width: 400px;
background:
radial-gradient(100% 100% at top, transparent 60%, yellow 61%),
url(https://i.picsum.photos/id/10/800/800.jpg) center/cover;
}
<div class="first">
</div>
Using mask
if you want transparency:
.first {
height: 200px;
width: 400px;
background: url(https://i.picsum.photos/id/10/800/800.jpg) center/cover;
-webkit-mask:radial-gradient(100% 100% at top, #fff 60%, transparent 61%);
mask:radial-gradient(100% 100% at top, #fff 60%, transparent 61%);
}
.bottom {
-webkit-mask:radial-gradient(100% 100% at top, transparent 60%, #fff 61%);
mask:radial-gradient(100% 100% at top, transparent 60%, #fff 61%);
}
body {
background:yellow;
}
<div class="first">
</div>
<div class="first bottom">
</div>