Kvitova overcame Wozniacki 3-6, 7-6 (3), 7-5 in 2 1/2 entertaining hours, and will play Garbine Muguruza in the final.
Muguruza advanced when her scheduled opponent, second-ranked Simona Halep, withdrew from the tournament on Friday because of a right foot injury.
A win on Sunday could lift Kvitova, ranked 21, back inside the top 10. The Czech star, a two-time Wimbledon champion and once ranked No. 2, took an extended break after being stabbed by a knife-wielding burglar at her home in December 2016. After winning in St. Petersburg, Russia, this month, plus two Fed Cup singles, she's on the second-best winning streak of her career.
Kvitova beat Wozniacki for the eighth time in 13 matchups, including the past four.
But Wozniacki made the running for the first set and a half.
Wozniacki had a chance to serve out the match in the second set at 5-4 and 6-5. But both times Kvitova broke right back. She was 3-1 down again in the tiebreak, but reeled off six straight points to force a third set.
In the third, Wozniacki made a crucial hold in the seventh game after double-faulting at 30-all.
It was then Kvitova's turn to dig deep in the next game, when she double-faulted twice to go down 15-30 but also managed to hold her serve.
A stunning return shot won Kvitova the ninth game and gave her an opportunity to serve for the win, but Wozniacki broke back to level at 5-5. Kvitova, however, broke right back, and finally served out the set and match. She hit 50 winners to 14 by Wozniacki.
"I don't know what happened," Kvitova said. "I felt like I was crazy a little bit in my mind and I was playing it everywhere, except for the court. I was just trying to calm down in the second set. I was just trying to wait for that opportunity.
"In the tiebreak when I was down 3-1, I was just really angry with myself so I just tried to hit some winners. That's how that ended."
Wozniacki was disappointed at failing to serve out the match twice in the second set.
"She has a difficult game to play against when she's on, but as well when she isn't, because you don't get any rhythm and you know that eventually she's going to start hitting those balls in and you need to be ready for it," she said.
Kvitova has a 3-1 record against fourth-ranked Muguruza, including winning their last match, in the US Open fourth round.