To achieve this effect, you convolve the image with a line segment-like kernel (or PSF, a Point Spread Function), like this:
img = cv2.imread("Lenna.png")
psf = np.zeros((50, 50, 3))
psf = cv2.ellipse(psf,
(25, 25), # center
(22, 0), # axes -- 22 for blur length, 0 for thin PSF
15, # angle of motion in degrees
0, 360, # ful ellipse, not an arc
(1, 1, 1), # white color
thickness=-1) # filled
psf /= psf[:,:,0].sum() # normalize by sum of one channel
# since channels are processed independently
imfilt = cv2.filter2D(img, -1, psf)
To be more realistic you need to perform blurring in linear domain (i.e. invert then re-apply sRGB gamma, see here, it's a whole another can of worms), but this simple code gets you the following:
Source:

Result:
