Because you have to remember there are two ways to get to an image.
There is the path (c:/wamp/www/,,,,), which is what your web server uses to interact with the filesystem
Then there is the URL. The URL is what the outside world use to request the image (/upload/images/products/2016/mugshot.jpg)
The url is relative to the root of the public folder of project (the document root)
If you store the full path to the image in the database then you will have problems extracting the bits you need for the URL
public_path() is a helper for the public folder but does not belong in the URL.
If you change your code slightly, you should get what you want;
$image = $request->file('cover_image');
$filename = $image->getClientOriginalName();
$year = Carbon::now()->year;
$imagePath = "upload/images/products/{$year}/";
$uploaded = $image->move(public_path($imagePath), $filename);
$product = Product::create(array_merge($request->all(), ['cover_image' => $imagePath . $filename]));