Dependency injection is one way of implementing inversion of control – a programming principle that allows for better modularity and extensibility. Dependency injection is commonly achieved via constructor injection, field injection, or setter injection.
Inversion of control is an abstract concept, which dependency injection is a realisation of.
Other methods of implementing inversion of control for example include the template pattern, service discovery, delegates, events, and currying (when applying a functional programming paradigm).