Самое простое - засунуть в верстку обе картинки отдельными элементами, но одну из них скрыть через visibility или opacity. А при ховере менять их местами.
Но тут будет побочный эффект - скрытые картинки будут грузиться вперемешку с главными, замедляя загрузку в целом. Если картинок немного, то пофиг. Если много, придется использовать JS, который сначала дождется загрузки первых картинок и только потом в фоне подгрузит первые.
В целом ничего сложного, всё легко гуглится.